목차20개 항목
출처와 참고
안전한 프로그램의 원칙, 익스플로잇·취약점 생명주기, 포트 스캔, 고전 암호 부분은 팔만코딩경(42Seoul 커뮤니티 위키)의 「해킹/보안) 0. 안전한 프로그램을 만들기 위해 생각해야 하는 것들」, 「1-1. 포트 스캔」, 「1-2. 익스플로잇」, 「42 Common Core 암호문 해독 입문」·「실전」을 바탕으로 보강했다. 「위협 모델」, 「버퍼 오버플로와 메모리 보호」, 「키 길이와 전수 조사」, 「일방향 함수와 디피-헬만」, 「보안 모델」 절과 사회공학·악성 코드·설계 원칙 표의 일부 행은 CrashCourse의 「Crash Course Computer Science」 강의를 바탕으로 보강했다.
보안 문제는 "무엇을 지키는가(3요소) → 어떻게 공격받는가(공격 기법) → 무엇으로 막는가(암호, 접근 통제, 보안 프로토콜)"의 흐름으로 정리하면 기억하기 쉽다.
보안 3요소 (CIA)
| 요소 | 의미 |
|---|---|
| 기밀성 (Confidentiality) | 인가되지 않은 사용자에게 정보가 공개·노출되지 않음 |
| 무결성 (Integrity) | 정당한 방법 없이는 데이터가 변경되지 않음 |
| 가용성 (Availability) | 권한 있는 사용자가 원할 때 서비스를 지속적으로 사용할 수 있음 |
위협 모델
위협 모델(threat model)은 "누구로부터 지키는가"를 먼저 정해 두는 일이다. 공격자의 능력(원격인가, 기기를 손에 쥐었나, 시간과 돈은 얼마나 있나), 목표, 그리고 들어올 수 있는 경로인 공격 벡터(attack vector)를 적는다.
- 보안은 절대값이 아니라 위협 모델에 대한 상대값이다. 같은 노트북이라도 호기심 많은 룸메이트와, 무제한 시간 동안 기기를 가진 공격자에게 필요한 방어는 다르다.
- 모든 공격을 막으려 하면 아무것도 제대로 못 막는다. 위협 모델이 방어의 범위와 우선순위를 정한다.
- 설계는 늘 가정을 깔고 있다(예: 사용자가 비밀번호를 남에게 알려 주지 않는다). 가정이 깨지면 방어도 깨지므로 가정을 명시해 둔다.
설계 단계에서 위협 모델링을 개발 흐름에 넣는 방법(STRIDE 등)은 DevSecOps: 개발 흐름에 보안을 넣기에 있다.
주요 공격 기법
서비스 거부(DoS) 계열
| 공격 | 방식 |
|---|---|
| Land Attack | 출발지와 목적지 주소(포트)를 모두 피해자로 위조 → 자기 자신에게 계속 응답하다 마비 |
| Smurfing | 출발지를 피해자 IP로 위조한 ICMP Echo를 브로드캐스트 → 수많은 응답이 피해자에게 몰림 |
| Ping of Death | 허용 크기를 넘는 ICMP 패킷을 보내 잘게 쪼개진 조각을 대량으로 처리하게 함 |
| HTTP GET Flooding | 과도한 GET 요청으로 웹 서버를 과부하시키는 응용 계층 DDoS |
| SYN Flooding | TCP 3-way handshake의 구조를 악용해 SYN만 대량으로 보내 연결 대기열을 가득 채움 |
| UDP Flooding | 대량의 UDP 패킷을 임의의 포트로 보내 응답(ICMP Unreachable) 처리로 자원 고갈 |
| Teardrop | IP 단편(fragment)의 Offset 정보를 조작해 재조합 과정에서 오류를 일으킴 |
DDoS는 여러 대의 좀비 PC(에이전트)를 조종해 위 공격을 한 대상에 동시에 퍼붓는다.
네트워크 엿보기·위장
| 공격 | 방식 |
|---|---|
| Sniffing | 네트워크 패킷을 몰래 엿보는 수동적 공격 |
| Spoofing | 신뢰된 대상으로 위장 (IP·ARP·DNS 스푸핑). ARP 스푸핑은 MAC 주소를 위조해 트래픽을 가로챔 |
| Session Hijacking | 정상 연결을 RST로 끊고 재연결 시 공격자와 연결되게 해 세션을 가로챔 |
SYN Flooding·Session Hijacking이 악용하는 TCP 연결 과정은 전송 계층의 TCP 절, ARP 스푸핑의 대상인 ARP는 네트워크 계층에 정리했다.
애플리케이션·사용자 대상
| 공격 | 방식 |
|---|---|
| SQL Injection | 검증되지 않은 입력값에 SQL을 삽입해 DB를 열람·조작. 입력이 x'; DROP TABLE users; --면 원래 조회 뒤에 테이블 삭제 명령이 이어 붙는다. 인증을 뚫지 않고도 피해를 낸다 |
| XSS | 게시판 등에 악성 스크립트를 심어 다른 사용자의 쿠키·정보 탈취 |
| Phishing | 은행·사내 시스템을 흉내 낸 가짜 사이트로 유인해 로그인 정보를 입력하게 함. 성공률이 0.1%여도 메일 100만 통이면 계정 1,000개다 |
| Pretexting | 사내 IT 담당자 등으로 사칭해 전화·메신저로 설정 변경이나 비밀번호 공개를 유도. 내부 번호로 돌려 받게 해 신뢰를 얻기도 한다 |
| Smishing / Qshing | SMS / QR 코드를 이용한 피싱 |
| Spear Phishing | 특정 개인·조직을 겨냥한 맞춤형 피싱 |
| Key Logger | 키 입력을 가로채 ID·비밀번호 탈취 |
| Zero-day | 취약점 패치가 나오기 전에 이루어지는 공격 |
피싱·프리텍스팅처럼 시스템이 아니라 사람을 속여 정보를 얻거나 문을 열게 하는 방식을 사회공학(social engineering)이라 한다. 열 번 시도해 한 번만 걸려도 공격자에게는 충분하다.
XSS와 CSRF의 원리와 실제 방어법은 웹 보안: CSRF와 XSS를 참고한다.
악성 소프트웨어
| 종류 | 하는 일 |
|---|---|
| Trojan Horse | 사진·청구서 같은 무해한 첨부 파일로 위장해 사용자가 직접 실행하게 만든다 |
| Worm | 스스로 복제해 퍼진다. 패치되지 않은 취약점을 타고 사람의 조작 없이 컴퓨터에서 컴퓨터로 옮겨 간다 |
| Botnet | 감염시켜 원격 조종하는 컴퓨터(좀비 PC) 무리. 스팸 발송, 남의 전기로 하는 암호화폐 채굴, DDoS, 여러 계정에 같은 비밀번호를 동시에 대입하는 공격에 쓴다 |
| Spyware | 동의 없이 설치되어 정보를 수집·전송한다 |
| Ransomware | 파일을 암호화하고 복호화 대가로 돈을 요구한다 |
| Backdoor | 정상 인증을 거치지 않고 들어오는 통로. 유지보수용으로 일부러 남기기도 하지만 공격자가 악성 코드를 숨기는 통로가 된다. 심은 쪽만 쓰도록 암호 기법을 쓴 비대칭 백도어도 있다 |
익스플로잇과 취약점의 생명주기
취약점(vulnerability)은 시스템의 보안 결함이고, 익스플로잇(exploit)은 그 결함을 실제로 이용하는 코드나 기법이다. 공개된 취약점에는 CVE 번호가 붙고 CVSS 점수로 심각도를 매긴다(NVD, cve.org에서 조회).
| 익스플로잇이 노리는 결과 | 예 |
|---|---|
| 원격 코드 실행(RCE) | 버퍼 오버플로, 역직렬화 취약점으로 서버에서 임의 명령 실행. 가장 심각 |
| 권한 상승 | 일반 사용자 → root. setuid 프로그램, 커널 버그 |
| 서비스 거부(DoS) | 자원을 고갈시켜 서비스 중단 |
| 데이터 탈취·조작 | SQL Injection, 경로 조작(path traversal) |
| 시점 | 상태 | 위험 |
|---|---|---|
| 제로데이(0-day) | 공급자가 모르거나 패치가 없음 | 막을 수단이 없다. 고가에 거래된다 |
| 원데이·N데이 | 패치는 나왔지만 적용되지 않음 | 패치 내용을 분석하면 공격법이 드러나므로 공개 직후가 가장 위험하다 |
| 패치 미적용이 방치된 상태 | 오래전 패치가 있는데도 관리 소홀로 남음 | 패치와 공격법이 모두 알려져 있어 쉽게 뚫리지만, 패치만 적용하면 막을 수 있다 |
방어의 기본은 빠른 패치와 의존성 업데이트다(npm audit, Dependabot 같은 도구로 알림을 받는다).
버퍼 오버플로와 메모리 보호
버퍼(buffer)는 데이터를 담으려고 잡아 둔 메모리 구역이다. 10바이트로 잡은 비밀번호 버퍼에 길이 검사 없이 20바이트를 복사하면, 넘친 10바이트가 바로 옆 메모리를 덮어쓴다. 이것이 버퍼 오버플로(buffer overflow)다.
- 아무 값이나 덮이면 프로그램이 죽는다(서비스 거부).
- 공격자가 값을 골라 넣으면 옆에 있던
is_admin같은 변수나 함수의 복귀 주소를 원하는 값으로 바꿔, 로그인을 건너뛰거나 자기 코드를 실행시킨다(RCE).
| 방어 | 원리 |
|---|---|
| 경계 검사(bounds checking) | 복사하기 전에 입력 길이를 버퍼 크기와 비교한다. Rust·Java·Python 같은 메모리 안전 언어는 언어가 자동으로 한다 |
| 주소 공간 무작위화(ASLR) | 스택·힙·라이브러리의 위치를 실행마다 바꾼다. 덮어쓸 주소를 모르니 공격이 권한 획득보다 충돌로 끝날 가능성이 커진다 |
| 스택 카나리(canary) | 버퍼 바로 뒤에 무작위 값을 두고 함수가 끝날 때 바뀌었는지 확인한다. 바뀌었으면 넘침이 있었다는 뜻이라 즉시 종료한다. 탄광의 카나리아에서 따온 이름이다 |
| 실행 방지(NX·DEP) | 데이터 영역(스택·힙)을 실행할 수 없게 표시해, 넣은 코드를 바로 실행하지 못하게 한다 |
C에서 범위 밖 쓰기를 찾는 도구(AddressSanitizer, valgrind)는 C 디버깅 도구에 있다.
포트 스캔
포트 스캔은 대상 호스트의 어떤 포트가 열려 있고 무슨 서비스가 도는지 알아내는 일이다. 공격의 정찰 단계이자, 관리자가 자기 시스템의 노출면을 점검하는 수단이다. 대표 도구는 Nmap이다.
| 기법 | 방식 |
|---|---|
| TCP 연결 스캔 | 3-way handshake를 끝까지 맺어 열림·닫힘 판단. 기록이 남는다 |
| SYN 스캔(반개방) | SYN만 보내고 SYN-ACK이 오면 열림, RST로 끊는다. 연결이 완성되지 않아 덜 드러난다(TCP) |
| UDP 스캔 | 응답이 없으면 열림·필터링, ICMP port unreachable이면 닫힘. 느리다 |
| 서비스·버전 탐지, 스크립트 스캔 | 배너와 응답으로 소프트웨어 버전을 알아내고 알려진 취약점을 점검 |
방어 측은 불필요한 포트를 닫고(방화벽 ufw, 클라우드 보안 그룹), IDS·IPS로 비정상 스캔을 탐지한다. 허가받지 않은 시스템을 스캔하는 것은 불법이 될 수 있다. 자기 시스템이나 허가된 범위에서만 한다.
안전한 프로그램의 원칙
| 원칙 | 뜻 |
|---|---|
| 입력을 믿지 않는다 | 길이·형식·범위를 서버에서 검증하고, 출력할 곳(SQL, HTML, 셸)에 맞게 이스케이프한다. 버퍼 오버플로·SQL Injection·XSS가 모두 여기서 나온다 |
| 최소 권한 | 필요한 코드에, 필요한 권한만, 필요한 동안만 준다. 침해돼도 피해가 갇힌다(리눅스 접근 제어) |
| 검증된 암호를 쓴다 | 직접 만든 비공개 알고리즘은 결함을 찾을 사람이 없을 뿐이다. 알고리즘은 공개되고 키만 비밀이어야 한다는 케르크호프스 원칙을 따른다 |
| 안전한 기본값 | 기본 설정이 닫혀 있어야 한다. 관리자 비밀번호 기본값, 디버그 모드 노출 금지 |
| 구현을 줄인다 | 보안을 책임지는 코드, 즉 신뢰 컴퓨팅 기반(TCB, trusted computing base)을 최대한 작게 만들고, 외부 개발자가 감사할 수 있게 공개해 검토받는다 |
| 격리 | 뚫리는 것을 전제로 피해를 가둔다. 운영체제는 프로세스마다 메모리를 나누고, 앱은 샌드박스에서, 서비스는 가상 머신·컨테이너에서 돌린다(가상화와 하이퍼바이저) |
| 심층 방어(defense in depth) | 완벽한 방어 하나는 없으므로 성의 해자·성벽·경비처럼 서로 다른 방어를 여러 겹 쌓는다. 한 겹이 뚫려도 다음 겹이 막는다 |
암호 알고리즘
대칭 키 (암호화 키 = 복호화 키)
| 알고리즘 | 특징 |
|---|---|
| DES | IBM 개발, 64비트 블록, 56비트 키, 16라운드. 지금은 안전하지 않음 |
| AES | DES를 대체한 NIST 표준, 128비트 블록, 128/192/256비트 키 |
| SEED | KISA 개발, 128비트 블록 |
| RC4 | 스트림 암호. 취약점이 밝혀져 TLS에서는 사용이 금지되었다(RFC 7465) |
키 길이와 전수 조사
키가 n비트면 가능한 키는 2ⁿ개이고, 1비트 늘 때마다 전수 조사 시간이 두 배가 된다. DES의 56비트 키(약 7.2×10¹⁶개)는 1977년 표준이 될 때는 충분했지만, 1998년 약 25만 달러짜리 전용 기계(EFF의 Deep Crack)가 며칠 만에 키를 찾아내면서 안전하지 않게 됐다. AES-128의 2¹²⁸개는 지구의 모든 컴퓨터를 동원해도 전수 조사할 수 없다.
AES는 데이터를 16바이트 블록으로 나누고, 키에서 만든 라운드 키로 치환·전치·섞기를 여러 번 되풀이한다(128비트 키는 10라운드, 192비트 12라운드, 256비트 14라운드). 라운드와 키를 무한정 늘리지 않는 것은 성능과 안전의 균형 때문이다. 연결 하나 맺는 데 몇 분이 걸리는 암호는 아무도 쓰지 않는다.
비대칭 키 (공개키 / 개인키)
RSA는 큰 수의 소인수분해가 어렵다는 점을 이용하고, 디피-헬만은 안전하지 않은 통신망에서 공통 비밀키를 교환한다.
일방향 함수와 디피-헬만
대칭키는 양쪽이 같은 키를 가져야 하는데, 인터넷에서는 키를 미리 건넬 방법이 없고 키를 그냥 보내면 도청당한다. 키 교환(key exchange)은 키 자체를 보내지 않고 양쪽이 같은 키를 계산해 내게 한다. 바탕은 일방향 함수(one-way function), 즉 계산은 쉽지만 거꾸로 풀기는 어려운 함수다. 물감 두 색을 섞기는 쉬워도 섞인 색에서 원래 색을 알아내기 어려운 것과 같다.
디피-헬만의 일방향 함수는 모듈러 거듭제곱이다. 3⁵ mod 31은 243을 31로 나눈 나머지 26으로 바로 나오지만, "3을 몇 제곱해 31로 나눴더니 7이 남았다"에서 지수를 찾으려면 하나씩 대입해야 한다(이산 로그 문제). 수가 수백 자리면 사실상 풀 수 없다.
sequenceDiagram participant A participant C participant E as 도청자 Note over A,C: 공개값: 밑 B, 법 M (누구나 안다) Note over A: 비밀 x 선택 A->>C: Bˣ mod M 전송 Note over C: 비밀 y 선택 C->>A: Bʸ mod M 전송 Note over A: (Bʸ)ˣ mod M = Bˣʸ mod M Note over C: (Bˣ)ʸ mod M = Bˣʸ mod M Note over A,C: 같은 값이 공유 키 Note over E: Bˣ, Bʸ만 봐서는 x, y도 Bˣʸ도 구할 수 없다
이렇게 얻은 공유 키로 AES 같은 대칭 암호를 쓴다. 다만 이 계산만으로는 상대가 누구인지 모르므로 인증서·서명과 함께 쓴다. 세션마다 새 키를 만드는 방식이 주는 전방 비밀성은 웹 PKI의 변천에 있다.
해시 (일방향)
원문을 고정 길이 값으로 바꾸며 되돌릴 수 없다. 무결성 검사와 비밀번호 저장에 쓴다. MD5(128비트)와 SHA-1은 충돌 공격이 알려져 보안 용도로 쓰지 않는다. 지금은 NIST 표준인 SHA-2(SHA-256 등, NSA 설계)와 공개 공모로 뽑힌 SHA-3(Keccak)를 쓴다.
보안 프로토콜
- TLS: 응용 계층과 TCP 사이에서 통신을 암호화한다. SSL과 TLS 1.0·1.1은 폐기되어 TLS 1.2·1.3만 쓴다(HTTPS와 TLS).
- IPSec: 네트워크 계층(3계층)의 IP 보안 프로토콜. AH로 무결성·인증, ESP로 기밀성(암호화) 제공
고전 암호와 인코딩은 보안이 아니다
| 방식 | 원리 | 깨는 법 |
|---|---|---|
| 카이사르 암호, ROT13 | 알파벳을 일정 칸 밀기 | 키가 25가지뿐. 전수 대입 즉시 |
| 치환 암호 | 글자마다 다른 글자로 | 글자 빈도 분석. 영어에서 가장 흔한 E가 바뀐 글자도 가장 자주 나온다 |
| 전치 암호(transposition) | 글자는 그대로 두고 순서만 섞는다. 예: 5×5 격자에 가로로 채우고 왼쪽 아래부터 세로로 읽기. 격자 크기와 읽는 순서가 키 | 글자 빈도가 원문과 같아 전치임이 드러나고, 격자 크기 후보가 적어 맞춰 볼 수 있다 |
모스 부호, 리트(leet, 1337) | 표기 방식만 바꿈 | 대응표만 있으면 누구나 읽음 |
| Base64, URL 인코딩 | 이진 데이터를 텍스트로 옮기는 인코딩 | 키가 없으므로 그냥 디코딩된다 |
- 인코딩은 형식 변환, 암호화는 키가 있어야 풀리는 변환, 해시는 되돌릴 수 없는 변환이다. Base64로 감싼 비밀번호는 평문과 같다(Base64 인코딩). 네 가지 변환과 용도별 암호 부품 고르기는 인코딩·암호화·해시·토큰화와 디지털 서명에 있다.
- 현대 암호(AES, ChaCha20)는 알고리즘을 공개해도 키 없이는 풀 수 없다. 남는 공격은 키 자체를 맞히는 것이다. 무차별 대입(모든 키)과 사전 공격(사람이 쓸 법한 단어·이름 목록)이 그것이고, 사람이 정한 비밀번호가 짧고 뻔할수록 쉽게 뚫린다.
- 그래서 비밀번호 저장에는 일부러 느리게 만든 해시(bcrypt, scrypt, Argon2)와 솔트를 쓴다(비밀번호 저장과 비밀번호 관리자). bcrypt는 블록 암호 Blowfish의 비싼 키 설정 과정을 반복해 대입 속도를 늦춘다. Blowfish 자체는 블록이 64비트로 작아 새 시스템에서는 AES를 쓴다.
접근 통제
접근 통제는 정책, 메커니즘, 보안 모델의 3요소로 구성된다.
시험에 나오는 세 방식은 DAC(임의 접근 통제: 데이터 소유자가 사용자 신원을 기준으로 허가), MAC(강제 접근 통제: 시스템이 주체와 객체의 보안 등급을 비교), RBAC(역할 기반 접근 통제: 중앙 관리자가 역할에 권한을 묶음)다. ACL·ABAC·ReBAC까지 넣은 모델 비교표는 권한 시스템 설계에, 리눅스의 구현(파일 권한이 DAC, AppArmor·SELinux가 MAC)은 리눅스 접근 제어에 있다.
보안 모델
MAC에서 등급(공개 < 비밀 < 극비)을 어떻게 비교할지 정한 규칙이 보안 모델이다. 무엇을 지키느냐에 따라 방향이 반대다.
| 모델 | 지키는 것 | 규칙 | 이유 |
|---|---|---|---|
| 벨-라파듈라(Bell-LaPadula) | 기밀성 | 위로 읽기 금지, 아래로 쓰기 금지(no read up, no write down) | 비밀 등급은 극비 문서를 못 읽고, 극비 등급은 공개 문서에 쓰지 못해 상위 정보가 실수로 아래로 새지 않는다. 미 국방부의 다단계 보안 정책에서 나왔다 |
| 비바(Biba) | 무결성 | 아래로 읽기 금지, 위로 쓰기 금지 | 믿을 수 없는 낮은 등급 데이터가 높은 등급 데이터를 오염시키지 않게 한다 |
| 만리장성(Chinese Wall) | 이해 충돌 방지 | 한 회사의 자료를 본 사람은 경쟁사 자료에 접근할 수 없다 | 컨설팅·금융처럼 경쟁 관계 고객을 함께 다루는 조직 |
최고 등급자도 낮은 등급 파일을 고칠 수 없다는 점이 직관과 다르지만, 그것이 정보 유출 경로를 막는 장치다.
AAA
인증(Authentication, 누구인지 확인) → 인가(Authorization, 어떤 권한을 줄지 결정) → 계정 관리(Accounting, 사용 시간·위치 등 사용 기록 수집)의 묶음이다. 인증에 쓰는 세 가지 요소(아는 것·가진 것·나 자신)와 각각의 약점은 2단계 인증: TOTP와 패스키에 있다.
관련 노트: HTTPS와 TLS, 리눅스 접근 제어: DAC, MAC, sudo, 웹 보안: CSRF와 XSS, 보안 시스템 설계: 원칙과 민감 데이터 관리
원본 기록9
- 원문 (새 창) riverkim.kr/201
- Notion 원문 (새 창) 80000coding.notion.site/5c5a05d1cc404dbf872088a4d4f985a8
- Notion 원문 (새 창) 80000coding.notion.site/1aeb2f5708a4404cbbf73265af6900a5
- Notion 원문 (새 창) 80000coding.notion.site/8bdc5afbe56f49a3bc5d67f1d7243e26
- Notion 원문 (새 창) 80000coding.notion.site/2546b097b05d487295afbefc758b6cc0
- Notion 원문 (새 창) 80000coding.notion.site/926ddbd86b334c348fcbb8645ec95018
- 원문 (새 창) www.youtube.com/watch?v=bPVaOlJ6ln0
- 원문 (새 창) www.youtube.com/watch?v=_GzE99AmAQU
- 원문 (새 창) www.youtube.com/watch?v=jhXCTbFnK8o