핵심 인사이트 (3줄 요약)

  1. 본질: TCP가 3-Way Handshake를 시작할 때 무조건 0번이나 1번부터 시작하지 않고 수십억 대의 미친 난수표(Initial Sequence Number, ISN)를 뽑아서 첫 번째 번호표로 삼는 것은 순전히 해킹과 데이터 뒤섞임을 막기 위한 고도의 안전장치다.
  2. 세션 하이재킹 방어: 만약 번호가 항상 1번부터 시작한다면, 해커는 내 컴퓨터인 척 IP를 위조하여 "나 1번이야, 연결 끊어 줘(FIN)!"라며 서버에 가짜 패킷을 쑤셔 넣어 **통신을 강제로 끊거나 남의 세션을 훔치는 짓(Session Hijacking)**을 아주 쉽게 저지를 수 있다.
  3. 지연된 패킷의 환생 방지: 어제 접속했던 낡은 세션에서 바다를 떠돌다 길을 잃었던 지연 패킷(Seq 100번)이, 오늘 새로 맺은 세션에 뜬금없이 도착했을 때, ISN이 난수로 서로 확연히 다르다면 OS는 "이거 어제 패킷이잖아! 버려!"라며 낡은 찌꺼기를 완벽하게 쳐낼 수 있다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: TCP 연결 설정 시 송신자와 수신자가 데이터의 순서 및 스트림 경계를 추적하기 위해 생성하는 32비트 무작위 시작 번호 (RFC 6528 등에서 보안 생성 난수 생성 권고).

  • 필요성: 과거 초창기 TCP는 타이머에 의존해서 번호를 꽤 얌전하게(?) 순서대로 올렸다. 해커(케빈 미트닉)가 이걸 가만히 지켜보니 번호의 패턴이 보였다. 해커는 서버에 보이지 않는 위치에 숨어서, **"아마 지금쯤 서버가 기다리는 다음 번호는 1005번이겠지?"**라고 예측한 뒤, 찐 유저의 IP로 위조하여 Seq=1005짜리 해킹 명령어를 서버에 꽂아 넣었다. 서버는 "오! 찐 유저가 보낸 다음 번호 맞네!" 하고 덥석 악성코드를 실행해 버렸다. "번호를 도저히 인간이 예측할 수 없는 완벽한 난수로 꼬아버려라!!" 이것이 ISN 난수화의 태동이다.

  • 💡 비유: ISN 무작위 할당은 은행 보안 카드의 **"매번 바뀌는 OTP 난수 번호"**와 같습니다.

    • 고정 번호: 은행 이체 시 맨날 똑같은 비밀번호 "1234"를 씁니다. 해커가 어깨너머로 한 번만 보면 평생 내 계좌를 털 수 있습니다.
    • ISN (OTP): 이체를 시작할 때마다 내 OTP 기계(운영체제)가 **"오늘은 948,102번부터 시작합시다!"**라고 무작위 난수를 띄워 서버와 맞춥니다. 해커가 어제 훔쳐본 번호는 오늘 쓸모없는 쓰레기가 됩니다.

📢 섹션 요약 비유: ISN을 0번부터 시작하지 않는 것은 책을 읽을 때마다 **"매번 랜덤한 쪽수에서 이야기를 시작하는 암호 책"**을 쓰는 것과 같습니다. 스파이(해커)가 몰래 "다음 장 내용은 이거야"라며 위조된 페이지를 끼워 넣으려 해도, 오늘 우리가 몇 쪽부터 읽기 시작했는지(ISN) 모르면 절대 위조 페이지를 끼워 넣을 수 없습니다.


Ⅱ. ISN의 보안 방어 메커니즘과 취약점 역사 (Deep Dive)

1. TCP Session Hijacking (세션 가로채기)의 공포

해커가 내 PC와 은행 서버 간의 통신을 털어버리는 과정이다.

  1. 내 PC와 은행 서버가 연결(ESTABLISHED)되었다. 현재 주고받는 시퀀스 넘버는 5000 부근이다.
  2. 해커는 내 PC를 DoS 공격으로 잠시 기절시킨다(침묵).
  3. 해커는 내 PC의 IP로 위장하여 Seq=5001 번을 달고 은행 서버에 패킷을 던진다.
  4. 은행 서버는 "어? IP도 내 고객이고, 기다리던 번호(5001)도 맞네?" 하며 해커의 통신을 받아들인다. 세션이 털렸다!
  • 방어: 이 공격이 성공하려면 해커가 5001번이라는 다음 번호를 정확히 예측해야 한다. 현대의 운영체제(Windows, Linux)는 ISN을 암호학적으로 강력한 해시 함수를 돌려 완전한 난수로 뽑아내기 때문에, 해커가 이 32비트(42억 개) 숫자 중 하나를 찍어서 맞출 확률은 0에 수렴한다.

2. Phantom Packet (유령 패킷)의 혼란 방지

인터넷은 패킷의 무덤이다.

  • 어제 밤 10시에 내가 구글과 통신하다가 1번 패킷이 우주 미아가 됐다.
  • 오늘 아침에 내가 구글과 새로 통신을 맺었다(3-Way Handshake 완료).
  • 그런데 어제 미아가 됐던 1번 패킷이 바다를 돌고 돌아 갑자기 툭 튀어나와 구글 서버에 도착했다.
  • 만약 둘 다 0번부터 시작했다면: 구글 서버는 이 낡은 유령 패킷을 "오! 오늘 보낸 1번 패킷이네!" 하고 화면에 띄워버려 화면이 깨진다.
  • ISN 난수가 있다면: 어제는 ISN이 1000이었고, 오늘은 ISN이 50000이다. 어제의 1001번 패킷이 오면 "뭐야 이 쓰레기 번호는? 내 윈도우 범위를 한참 벗어났네!"라며 OS가 귀신같이 튕겨내 버린다.
 ┌─────────────────────────────────────────────────────────────┐
 │                ISN 기반 세션 방어 시나리오 (와이어샤크 뷰)         │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   [ 해커 (가짜 출발지 IP 세팅) ] ────▶ [ 은행 서버 ]              │
 │                                                             │
 │   해커의 추측: "아마 저기 대충 Seq=10 부터 시작했겠지? RST 던지자!" │
 │   해커가 쏜 가짜 패킷: [ 목적지 포트 443, Seq = 15, RST 켬! ]     │
 │                                                             │
 │   은행 서버의 뇌구조:                                          │
 │   "음? IP는 우리 고객님인데... 이 자식 뜬금없이 번호를 15번을 불렀네?" │
 │   "우리가 지금 통신하고 있는 번호 대역(ISN 기반)은 3,450,111 인데?"│
 │   "야! 너 번호 틀렸어!! 가짜 놈이네! 쓰레기통으로 가라 (Drop)!!"     │
 │                                                             │
 │   ▶ "32비트짜리 번호표 자체가 강력한 '일회용 패스워드' 역할을 수행한다!"│
 └─────────────────────────────────────────────────────────────┘

3. 실무적 의의

과거 초창기 리눅스(커널 2.4 시절 이전)는 ISN을 1초마다 일정하게 증가시키는 단순한 타이머 기반으로 만들어서 해커들의 밥이 되었다. 하지만 현재의 시스템은 접속 시간, IP 주소, 포트 번호, 그리고 커널만이 아는 비밀키(Secret Key)를 해시 믹서기에 같이 갈아서 ISN을 뽑아내므로 사실상 추측이 불가능하다.

📢 섹션 요약 비유: ISN 무작위 생성은 클럽 입장 팔찌의 **"매일 바뀌는 형광 도장 색깔"**입니다. 어제는 빨간색 도장을 썼고 오늘은 파란색 도장을 씁니다. 해커가 어제 주운 빨간색 팔찌(유령 패킷)를 차고 당당히 들어오려 해도, 기도(운영체제)가 "오늘 도장은 파란색(다른 ISN)인데?"라며 입구 컷을 시켜 완벽하게 무단침입을 차단합니다.