CS/소프트웨어보안

1. 소프트웨어 보안이슈 소개

arsenic-dev 2025. 10. 12. 02:36

경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.

 

버그 (Bug)

Bug란 소프트웨어 개발자가 한 실수이다.

이러한 Bug는 악성코드 유포, 해킹 등 소프트웨어 보안 문제를 야기하는 원천이다.

 

bug e.g., 버퍼 오버플로우

 

위 코드는 'i'라는 인덱스가 정의되지 않은 메모리 영역을 access하려는 시도를 하는 메모리 버그이다.

이렇게 제한된 용량보다 많은 데이터를 받아 메모리의 경계 영역을 넘는 버그를 버퍼 오버플로우(BOF, Out of Bound)라고 한다.

  • 소프트웨어 개발 플랫폼, 컴파일러 등 여러 면에서 개발자를 도와주기에 이 정도의 버그는 이제 잘 발생 X (전통적인 Bug)

 

버그는 메모리 버그와 메머리 버그가 아닌 버그, 이렇게 유형을 나누고,  이를 통해 프로그래밍 언어를 구분한다.

  • Safe language: 메모리 버그로부터 safe (e.g., python, Java, Ruby)
  • Unsafe language: 메모리 버그로부터 unsafe (e.g., C/C++, Rust)

 

즉, Unsafe language란 프로그래머한테 memory access를 허용해 주는 programming language이다.

  • Unsafe Language 사용 이유: 하드웨어에 가까운 저수준 영역에 대해 디테일하게 최적화 개발 (e.g., OS 개발)

 

코딩 실수로 인한 버그들의 종류엔 Memory Error, Logic Error, System Error가 있다.

 

1. Memory Error

Memory Error는 Memory Unsafe Language로 코딩 시에만 발생할 수 있다.

 

 

1) buffer overflow

2) integer overflow

3) use-after-free

4) double free

5) uninitialized access 초기화되지 않은 메모리 접근

 

버퍼 오버플로우 (Buffer overflow): 프로그램이 버퍼에 할당된 크기보다 많은 데이터를 쓸 때 인접 메모리를 덮어써서 코드 실행이나 크래시를 일으킬 수 있는 취약점.

정수 오버플로우 (Integer overflow): 정수 연산 결과가 타입의 최대값을 넘어올 때 값이 래핑되어 잘못된 길이/크기/메모리 계산을 유발하는 취약점.

Use-after-free: 이미 해제(free)된 메모리를 이후에 다시 참조(읽기/쓰기)하여 예측 불가능한 동작이나 임의 코드 실행을 허용하는 취약점.

Double free: 동일한 메모리 블록을 두 번 이상 해제하여 메모리 관리 자료구조가 손상되고 공격자가 제어를 얻을 수 있는 취약점.

Uninitialized access: 초기화되지 않은(쓰이지 않은) 메모리를 읽거나 사용해서 랜덤한 값이 동작에 영향을 주거나 민감정보가 유출될 수 있는 취약점.

 

2. Logic Error

메모리와 상관없이 모든 종류의 코딩 시 발생 가능한 오류로, 상위 레벨에서 로지컬하게 이상하게 처리를 시키는 것을 말한다.

  • 의도: strText의 소문자 'g' 개수 counting
  • 오류: Substring(i, 1)로 해야 각 문자를 순서대로 확인, 현재는 계속 두 번째 문자만 확인

 

1) consistency error (e.g., 계좌 이체가 한 번만 처리되어야 하는데 동일 이체가 두 번 실행)

2) authentication error (e.g., 인증되지 않은 사용자 로그인 허용)

 

Consistency error (일관성 오류): 분산 시스템이나 DB에서 서로 다른 노드나 트랜잭션이 같은 데이터에 대해 일치하지 않는 상태를 보일 때 발생하는 오류로, 데이터 무결성이나 동작 불일치를 초래함.

Authentication error (인증 오류): 사용자의 신원 확인이 실패하거나 부적절하게 처리되어 올바른 사용자에게 접근이 차단되거나 잘못된 사용자에게 접근이 허용되는 보안 문제.

 

3. System Error

시스템에 대한 이해 부족으로 인해 발생하는 버그를 말한다.

 

1) command injection (e.g., 사용자가 의도된 범위 외의 시스템 명령까지도 실행 가능)

2) sql injection

 

Command injection (명령어 주입): 애플리케이션이 사용자 입력을 시스템 명령으로 그대로 실행할 때 공격자가 임의 명령을 삽입해 서버를 제어하거나 데이터 유출/파괴를 일으킬 수 있는 취약점.

SQL injection (SQL 주입): 사용자 입력을 적절히 검증하지 않고 SQL 쿼리에 포함할 때 공격자가 쿼리를 조작해 데이터 조회·수정·삭제 또는 인증 우회 등을 할 수 있는 취약점.

 

해킹

해킹이랑 버그를 악용하는 기술이다.

 

해커의 원래 정의는 컴퓨터 시스템을 잘 아는 사람을 의미한다.

일반적으로 범죄를 하는 Black Hat Hacker를 떠올리지만, 버그를 악용이 아닌 좋은 쪽으로 활용하는 White Hat Hacker도 있다.

 

해킹의 목표: 버그를 통해 주어지지 않는 권한 획득 -> 정보 탈취/변조

  • 남의 컴퓨터에 악성 코드를 넣어 무단으로 정보 접근
  • 웹사이트의 DB 속 사용자 정보 무단 추출
  • 남의 핸드폰에 동의없이 악성코드를 넣어 정보 탈취
  • 남의 비밀번호를 무단으로 알아냄

 

이렇게 한 정보의 탈취/변조의 궁극적 목표는 금전 갈취, 정치/사업적 이용, 사회적 테러이다. (범죄)

 

해킹을 하기 위해서는 해킹 대상인 시스템에 대한 깊은 기술적 이해, 이래흘 바탕으로 보안 취약점 분석, 보안 취약점을 악용할 수 있는 능력(쉘코딩, exploit 작성), 이 세가지가 다 필요하다.

 

이러한 해킹은 크게 웹 해킹과 시스템 해킹으로 나눌 수 있다.

  • 웹 해킹: 웹 어플리케이션의 로직 오류 발생 시, 오류를 악용하여 비인가 권한/정보 획득
  • 시스템 해킹: 입력 데이터 처리 시 발생하는 버그(memory error)를 악용하여 비인가 권한/정보 획득

 

시스템 해킹 용어 및 개념 설명

1. BOF

Buffer Overflow 개념

 

2. DEP/NX (데이터 실행 방지)

메모리상의 데이터를 명령으로 해석하는 것을 금지하는 보안 기능이다. (메모리 영역마다 권한 분리 -> 데이터와 명령 구분)

  • DEP (Data Execution Prevention): 윈도우즈 용어
  •  NX (Never Execute): 리눅스 용어 

 

3. 커맨드 인젝션

데이터가 명령어로서 해석되는 취약점을 말한다. (e.g., SQL Injection)

"저"랑 "사귀어" 주세요 -> 저랑 사귀어 주세요

 

4. 쉘코드

CPU의 제어흐름을 바꿀 수 있다는 취약점이 있을 때 메모리에 삽입되어 실행되는 어셈블리 코드로서,

악성 동작을 수행하도록 설계된다.

 

쉘코드 example

 

※ 16진수 두 자리는 16^2 = 255 = 2^8로, 8비트, 즉 1바이트이기에 메모리 한 칸을 의미한다.

 

5. ROP

Return Oriented Programming의 약자로, DEP/NX 같은 실행 방어로 인해 쉘코드를 사용할 수 없는 상황을 우회하는 수단이다.

정상적으로 존재하는 어셈블리 Return 조각들을 연결하여 악성 코드의 조합으로 만들어 실행한다.

 

 

6. 퍼징

프로그램의 메모리 오류를 자동으로 탐색하는 기법이다.

이때, 버그 중에 보안 문제를 일으키는 보안 취약점이 발견된 경우, CVE 번호를 할당시키는 제도가 있다.

  • CVE (Common Vulnerability Exposure): 취약점에 부여되는 고유 식별자로, 전 세계에서 동일한 취약점을 일관되게 참조하기 위해 사용

 

해킹 이해를 위한 기본 개념

1. Firewall

방화벽, 해킹을 막아주는 대단한 시스템이 아니라 네트워크를 보고 규칙에 어긋나는 통신을 막아주는 필터이다.

 

2. Exploit, Malware

  • Exploit: 컴퓨터의 취약점을 악용해 공격하는 코드이다. (e.g., BOF, SQLi Exploit, XSS Exploit, CSRF)
  • Malware: 피해를 주는 목적으로 만들어진 악성코드이다. (e.g., Ransomware, 웜, 바이러스)

 

즉, 취약점을 점을 찾고 Exploit을 해서 남의 시스템에 들어가 정보에 접근하고, 그 다음 단계로 악성 코드를 심는다.

 

 

3. Ransomware

침투한 시스템의 정보를 암호화하여 인질(Ransom)로 삼아서 돈을 요구하는 유형의 악성코드이다.

 

4. Trojan horse

악성코드 침투 방식의 방법 중 하나로, 겉보기엔 정상 프로그램으로 위장해서 사용자에게 설치되도록 만드는 침투 방식이다.

그래서 사실상, 백도어(시스템에 몰래 남겨진 공격자의 원격 접근 통로)와 같은 개념이다.

 

5. Botnet, DDoS

DDos를 하기 위한 악성코드의 군단들로, 단독적으로가 아닌 대량으로 감염된 컴퓨터가 군단을 이루어 네트워크를 공격한다.

그렇게 되면, 취약점이 없이도 트래픽을 쏟아 특정 시스템을 마비시키는 DDoS 공격이 가능하다. (서버 다운 O, 정보 탈취 X)

  • DDoS e.g., 수강신청 서버 마비

 

6. Pen-testing

penetration testing(침투 테스트)의 약자로, 모의 해킹을 뜻한다.

 

13. Social Engineering

사회공학적 기법으로, 기술이 아닌 사람을 속여 해킹하는 사기 수법을 말한다.

 

2. 소프트웨어와 악성코드

https://arsenic-dev.tistory.com/89

'CS > 소프트웨어보안' 카테고리의 다른 글

5-1. 소프트웨어 보안을 위한 리눅스 기초  (0) 2025.10.17
4-3. 어셈블리 실습  (0) 2025.10.17
4-2. GDB 실습  (0) 2025.10.15
4-1. 메모리 구조  (0) 2025.10.15
3. IDA 활용 및 리버싱 방법  (0) 2025.10.13