본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Computer Science

정보 시스템 보안

작성 2026. 10. 14.추가
목차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 FloodingTCP 3-way handshake의 구조를 악용해 SYN만 대량으로 보내 연결 대기열을 가득 채움
UDP Flooding대량의 UDP 패킷을 임의의 포트로 보내 응답(ICMP Unreachable) 처리로 자원 고갈
TeardropIP 단편(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 / QshingSMS / 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)완벽한 방어 하나는 없으므로 성의 해자·성벽·경비처럼 서로 다른 방어를 여러 겹 쌓는다. 한 겹이 뚫려도 다음 겹이 막는다

암호 알고리즘

대칭 키 (암호화 키 = 복호화 키)

알고리즘특징
DESIBM 개발, 64비트 블록, 56비트 키, 16라운드. 지금은 안전하지 않음
AESDES를 대체한 NIST 표준, 128비트 블록, 128/192/256비트 키
SEEDKISA 개발, 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

댓글

GitHub 계정으로 댓글을 남길 수 있어요.