Chapter 16

보안의 기초

지금까지 컴퓨터가 어떻게 동작하는지를 배웠다. 이 장에서는 그 동작을 나쁜 의도로 이용하려는 사람으로부터 어떻게 지키는지 알아본다. 해커 영화처럼 화려한 이야기는 아니다. 대부분의 보안은 앞에서 배운 원리, 즉 숫자로 된 데이터, 메모리와 스택, 네트워크의 봉투, 운영체제의 권한을 정확히 이해하는 데서 출발한다.

무엇을 지키는가: 보안의 세 기둥

보안 문제는 대부분 다음 세 가지 중 하나를 깨뜨리려는 시도다. 보안 분야에서는 앞 글자를 따서 CIA라고 부른다.

목표뜻깨지는 예지키는 도구
기밀성
Confidentiality
허락된 사람만 볼 수 있다카페 Wi-Fi 도청, 해킹으로 고객 정보 유출암호화(HTTPS, 11장), 접근 권한
무결성
Integrity
몰래 바뀌지 않는다송금 금액 위조, 다운로드한 앱에 악성 코드 삽입해시, 전자 서명, 인증서
가용성
Availability
필요할 때 쓸 수 있다서버에 가짜 요청을 퍼부어 마비시키기, 랜섬웨어로 파일 잠그기여분 서버, 백업, 트래픽 걸러내기
식당의 세 가지 걱정

비밀 레시피가 새어 나가면 기밀성, 누군가 몰래 소금 통에 설탕을 바꿔 넣으면 무결성, 가짜 예약 전화가 빗발쳐 진짜 손님을 못 받으면 가용성의 문제다. 각각 지키는 방법이 다르다. 금고, 봉인 스티커, 예약 확인 절차.

해시: 데이터의 지문

해시 함수(hash function)는 아무리 긴 데이터를 넣어도 항상 같은 길이의 숫자(지문)를 내놓는 계산이다. 좋은 보안용 해시(예: SHA-256)는 세 가지 성질을 가진다.

SIMULATOR

SHA-256 지문과 눈사태 효과

A의 지문 (256비트를 16진수 64글자로)
B의 지문
서로 다른 비트—
비율 (이상적이면 약 50%)—
아래 격자의 칸 하나가 지문의 비트 하나다. 빨강은 A와 B의 지문에서 값이 다른 비트다. 한 글자만 바꿔도 절반 가까이가 바뀐다. 그래서 파일 하나에 악성 코드를 몰래 끼워 넣으면 지문이 완전히 달라져 바로 들통난다. 소프트웨어 배포처가 다운로드 파일의 SHA-256 값을 함께 공개하는 이유다.

비밀번호는 어떻게 저장해야 할까

웹사이트는 내 비밀번호를 기억해야 로그인을 확인할 수 있다. 하지만 비밀번호를 그대로 저장하면, 서버가 한 번 털리는 순간 모든 사용자의 비밀번호가 새어 나간다. 그래서 제대로 된 서비스는 비밀번호 대신 비밀번호의 해시를 저장한다. 로그인할 때 입력한 비밀번호를 같은 방식으로 해시해서 저장된 값과 비교한다. 서버도 내 비밀번호를 모른다.

✗ 그대로 저장 minji : sunflower1jun : 123456hana : 123456 털리면 그대로 노출.다른 사이트에서도같은 비밀번호를 쓰면 위험. △ 해시만 저장 minji : 7c2a…e91fjun : 8d96…c923hana : 8d96…c923 같은 비밀번호는 같은 지문.흔한 비밀번호의 지문 목록(레인보우 테이블)으로 들통. ✓ 솔트 + 느린 해시 jun : q8Zx | 41b0…7a2dhana : Lp3w | e7c4…19bb 사람마다 다른 소금(솔트)을섞어 해시 → 같은 비밀번호도지문이 다르다. 일부러 느린해시(bcrypt 등)로 대입을수만 배 느리게 만든다.
그림 16-1. 비밀번호 저장의 세 단계. 서버가 털려도 공격자가 비밀번호를 알아내기 어렵게 만드는 것이 목표다.

해시는 거꾸로 풀 수 없으므로, 공격자에게 남은 방법은 가능한 비밀번호를 하나씩 해시해서 맞춰 보는 무차별 대입(brute force)뿐이다. 이때 시간을 좌우하는 것은 비밀번호의 경우의 수, 즉 (쓸 수 있는 글자 수)길이다. 2장의 비트처럼, 한 자리가 늘 때마다 곱절로 커진다.

CALCULATOR

내 비밀번호를 맞히는 데 얼마나 걸릴까

쓰는 글자
공격자
가능한 경우의 수—
평균 맞히는 시간—
평균 시간은 경우의 수의 절반을 시도한다고 보고 계산했다. 그래프는 길이에 따른 시간이다(세로축은 로그 눈금). 해볼 것: 8자리 대소문자+숫자와 16자리 소문자를 비교해 보자. 기호를 섞는 것보다 길이를 늘리는 것이 훨씬 강력하다. “파란 하늘 아래 고양이 세 마리”처럼 외우기 쉬운 긴 문장이 좋은 비밀번호인 이유다. 단, 사전에 있는 단어 하나나 유출된 적 있는 비밀번호는 몇 초 만에 뚫린다. 공격자는 무작위가 아니라 흔한 것부터 시도하기 때문이다.
예측해 보기

대소문자+숫자 8자리 비밀번호를 12자리로 늘리면, 빠른 해시를 쓰는 GPU 공격자가 맞히는 시간은 대략 어떻게 될까?

위 계산기에서 길이만 8 → 12로 바꿔 보자.

한 자리마다 62배씩, 네 자리면 62⁴ ≈ 1,480만 배다. 길이는 지수로 효과가 커진다. 그래서 보안 권고는 “특수문자 섞기”보다 “충분히 길게”를 먼저 말한다.

고전 암호는 왜 깨질까

로마의 율리우스 카이사르는 글자를 알파벳 순서로 몇 칸씩 밀어서 편지를 썼다고 한다. A → D, B → E처럼. 열쇠는 “몇 칸 밀었나” 하나뿐이다. 이 카이사르 암호는 열쇠가 26가지뿐이라 하나씩 다 해 봐도 되지만, 더 영리한 방법이 있다. 영어에서는 E가 가장 자주 나온다. 암호문에서 가장 많이 나온 글자가 E일 가능성이 높다.

SIMULATOR

카이사르 암호와 빈도 분석

막대는 암호문 속 글자의 빈도, 점선은 보통 영어 글의 빈도다. 막대 모양이 점선 모양을 옆으로 민 것과 똑같다. 밀린 칸 수가 곧 열쇠다. 현대 암호(AES 등)는 글자 하나가 암호문 전체에 고르게 섞이도록 설계되어 이런 빈도 흔적이 남지 않는다. 열쇠의 경우의 수도 2¹²⁸ 이상이라, 지구의 모든 컴퓨터로 시도해도 우주의 나이보다 오래 걸린다.

버퍼 오버플로: 칸을 넘친 글자

13장에서 함수를 부르면 스택에 지역 변수와 돌아갈 주소가 나란히 쌓인다고 했다. 그런데 프로그램이 8글자짜리 칸(버퍼)을 만들어 놓고, 사용자가 입력한 글자를 길이 확인 없이 그대로 복사하면 어떻게 될까? 8글자를 넘는 부분이 옆 칸, 즉 돌아갈 주소를 덮어쓴다. 함수가 끝나면 CPU는 덮어쓴 엉뚱한 주소로 점프한다. 공격자가 그 주소를 자기가 심어 둔 코드 위치로 정교하게 맞추면 프로그램을 마음대로 조종할 수 있다. 이것이 수십 년간 가장 유명했던 공격, 버퍼 오버플로(buffer overflow)다.

SIMULATOR

스택 속 버퍼 넘치기

이름 버퍼 (8칸)다른 변수돌아갈 주소
실제 메모리 배치는 더 복잡하지만 원리는 같다. 요즘은 컴파일러가 돌아갈 주소 앞에 감시용 값(카나리)을 두어 덮어쓰기를 감지하고, 운영체제가 메모리 위치를 매번 무작위로 바꾸고(ASLR), 데이터 영역은 실행하지 못하게(9장의 권한 비트) 막는다. 가장 근본적인 해결은 경계를 자동으로 검사하는 언어(Rust, 자바, 파이썬 등)를 쓰는 것이다.

가장 약한 고리는 사람

암호가 아무리 튼튼해도 사람이 비밀번호를 직접 건네 버리면 소용없다. 은행이나 택배사를 사칭한 문자로 가짜 로그인 페이지에 유도하는 피싱(phishing)이 대표적이다. 가짜 페이지도 자물쇠(HTTPS)를 달 수 있다는 점을 기억하자(11장). 자물쇠는 “암호화되어 있다”는 뜻이지 “믿을 만한 곳”이라는 뜻이 아니다.

그래서 요즘은 비밀번호 하나에만 기대지 않는 2단계 인증(2FA)을 쓴다. “아는 것”(비밀번호)에 더해 “가진 것”(휴대폰, 보안 키)이나 “나 자신”(지문, 얼굴)을 함께 확인한다. 비밀번호가 새어도 휴대폰까지 훔치지 않는 한 로그인할 수 없다. 최근에는 아예 비밀번호 없이 기기 안의 개인 키로 서명해 로그인하는 패스키도 쓰인다. 사이트 주소까지 확인하므로 피싱에 속지 않는다.

① 아는 것비밀번호 ② 가진 것휴대폰의 6자리 코드 둘 다 맞아야로그인 비밀번호가 새도 공격자에게는 내 휴대폰이 없다. 코드는 30초마다 바뀐다 휴대폰과 서버가 같은 비밀값과 현재 시각으로 같은 숫자를 계산.
그림 16-2. 2단계 인증. 서로 다른 종류의 증거를 두 개 요구해서, 하나가 새어도 막을 수 있게 한다.
지금 바로 할 수 있는 것왜 효과가 있나 (관련 장)
운영체제와 앱을 최신으로 업데이트알려진 취약점(버퍼 오버플로 등)이 패치된다 (8·13장)
사이트마다 다른 긴 비밀번호 + 비밀번호 관리자한 곳이 털려도 다른 곳은 안전하다 (이 장)
2단계 인증 또는 패스키 켜기비밀번호가 새도 로그인할 수 없다 (이 장)
문자·메일 속 링크 대신 주소를 직접 입력피싱 페이지를 피한다 (11장)
중요한 파일은 다른 곳에 백업랜섬웨어·고장에도 가용성을 지킨다 (7장)

핵심 정리

  1. 보안은 기밀성(아무나 못 봄), 무결성(몰래 안 바뀜), 가용성(필요할 때 쓸 수 있음)을 지키는 일이다.
  2. 해시는 데이터의 지문이다. 거꾸로 풀 수 없고, 입력이 조금만 달라도 지문이 크게 달라진다(눈사태 효과).
  3. 비밀번호는 솔트를 섞은 느린 해시로 저장한다. 강도는 글자 종류보다 길이가 지수적으로 좌우한다.
  4. 고전 암호는 빈도 분석으로 깨진다. 현대 암호는 흔적을 남기지 않고 열쇠의 경우의 수가 천문학적이다.
  5. 버퍼 오버플로는 길이 검사 없는 복사가 스택의 돌아갈 주소를 덮어쓰는 공격이다. 카나리, ASLR, 실행 금지, 안전한 언어로 막는다.
  6. 사람을 노리는 피싱에는 2단계 인증과 패스키가 효과적이다.

확인 퀴즈

랜섬웨어가 회사의 파일을 모두 잠가 업무를 못 하게 만들었다. 가장 직접적으로 깨진 보안 목표는?

필요할 때 데이터를 쓸 수 없게 된 것이 핵심 피해다. 그래서 다른 곳에 둔 백업이 가장 확실한 대비책이다.

보안용 해시 함수의 성질이 아닌 것은?

해시는 일방향이다. 되살릴 수 있다면 비밀번호 저장에 쓸 수 없다.

비밀번호를 해시할 때 사용자마다 다른 ‘솔트’를 섞는 이유는?

솔트가 없으면 흔한 비밀번호의 지문을 미리 계산한 표로 한 번에 많은 계정을 알아낼 수 있다.

버퍼 오버플로 공격이 덮어쓰려는 가장 중요한 값은?

돌아갈 주소를 바꾸면 함수가 끝날 때 CPU가 공격자가 원하는 곳으로 점프한다(4장의 RET, 13장의 스택).

피싱 사이트의 주소창에도 자물쇠 아이콘이 보였다. 올바른 해석은?

자물쇠는 통신 구간의 기밀성을 뜻한다. 상대가 누구인지는 주소(도메인)를 직접 확인해야 한다.