라바 램프의 무용성: 무작위가 실제로 의미하는 것

19 hours ago 5
  • Cloudflare의 lava lamp 기반 난수 홍보는 인터넷 암호화에 큰 실질 기여를 하기보다 마케팅과 보안 연극에 가깝다
  • 암호화에서 중요한 것은 값의 본질적 무작위성보다 공격자가 그 값에 대해 얼마나 알고 있는지이며, 이 지식 차이가 보안성을 좌우함
  • One-time pad는 충분히 무작위인 키를 한 번만 쓰면 원문 정보를 숨기지만, 같은 키를 재사용하면 관찰된 정보와 결합돼 깨짐
  • 현대 시스템은 일회용 패드 대신 CSPRNG와 스트림 암호를 쓰며, ChaCha20이나 AES-256-CTR은 256비트 키로 현실적 보안을 제공함
  • 물리적 true RNG는 편향 제거가 어렵고 보안 증가도 작아, 서버가 직접 시드를 만들고 fast key erasure를 쓰는 단순한 설계가 더 안전함

무작위성은 대상보다 관찰자의 지식에 달림

  • Cloudflare는 lava lamp가 인터넷 암호화에 도움을 준다고 홍보하지만, 이 방식은 보안에 크게 기여하기보다 마케팅과 보안 연극에 가깝다
  • Cloudflare는 lava lamp 외에도 double pendulums, wave motion, mobiles 같은 물리적 예측 불가능성 장치를 사용함
  • return 4만 하는 XKCD식 함수는 항상 4를 반환하므로 대상 자체로는 무작위가 아니지만, 호출자가 “공정한 주사위로 고른 상수”라는 정보만 알고 한 번 호출했다면 관찰자의 확률 분포에서는 무작위로 다뤄질 수 있음
  • 암호화에서 중요한 질문은 결과가 본질적으로 무작위인지가 아니라, 공격자가 그 결과에 대해 얼마나 알고 있는지임
  • 같은 값이라도 누가 어떤 정보를 갖고 있는지에 따라 무작위성의 의미가 달라지고, 암호 시스템에서는 이 지식 차이가 보안성을 결정함

One-time pad가 작동하고 깨지는 방식

  • 러시안 룰렛 비유에서 공범은 총알 위치를 알고 있고, 플레이어와 사전에 공유한 주사위 값을 총알 위치에 더한 결과만 외부에 말함
  • 플레이어는 외친 값에서 주사위 값을 빼 총알 위치를 복원할 수 있지만, 상대는 주사위 값을 모르므로 외친 값만으로 총알 위치를 알 수 없음
  • 공정한 주사위라면 상대가 가진 사전확률 P(Ci)와 특정 숫자 S3을 들은 뒤의 사후확률 P(Ci|S3)가 같아짐
  • 베이즈 공식으로는 P(Ci|S3) = P(Ci) × 1/6 ÷ 1/6 = P(Ci)가 되어, 상대는 외친 값을 듣고도 아무 정보도 배우지 못함
  • 이 구조가 One-time pad의 핵심이며, 충분히 무작위인 키를 메시지와 한 번만 결합하면 암호문이 원문 정보를 드러내지 않음
  • 같은 키를 두 번째 게임에도 재사용하면 첫 게임에서 드러난 정보 때문에 상대가 주사위 값의 가능 범위를 좁힐 수 있음
  • 첫 게임에서 총의 앞 네 칸이 비어 있음이 확인되면 상대는 주사위가 3이나 4였을 가능성만 남았다고 알 수 있고, 두 번째로 공범이 “Four”를 외치면 총알이 첫 번째 칸 또는 마지막 칸 중 하나라는 정보까지 얻게 됨
  • One-time pad는 이름 그대로 한 번만 안전하며, 같은 키를 재사용하면 관찰된 암호문과 이전 정보가 결합되어 보안성이 무너짐

키 길이와 현대 암호화의 현실적 보안

  • 인터넷에서는 총알 위치 대신 비트와 바이트를 보내며, 한 비트의 “yes/no” 메시지는 동전 던지기 하나로 숨길 수 있음
  • 앞면이면 메시지를 그대로 두고, 뒷면이면 “yes”와 “no”를 뒤집는 방식은 동전 결과를 모르는 관찰자에게 원문을 숨김
  • 하지만 같은 동전 결과로 두 비트를 암호화하면 암호문은 네 가지 원문 가능성을 두 가지로 줄임
    • “Yes yes”는 원문이 “yes yes” 또는 “no no”였음을 뜻함
    • “No no”는 원문이 “no no” 또는 “yes yes”였음을 뜻함
    • “Yes no”는 원문이 “yes no” 또는 “no yes”였음을 뜻함
    • “No yes”는 원문이 “no yes” 또는 “yes no”였음을 뜻함
  • 일반화하면 n비트를 단일 동전 던지기 하나로 암호화할 때 가능한 원문 공간은 2^n에서 2개로 줄어듦
  • 완전한 정보이론적 의미에서 n비트를 제대로 암호화하려면 n비트 키가 필요하며, 그보다 긴 메시지는 일부가 복호화되고 관찰자가 이미 n비트 이상의 정보를 알고 있다면 대체로 전체가 복호화될 수 있음
  • Cloudflare가 처리하는 트래픽 전체에 일회용 패드를 적용하려면 천문학적 양의 무작위 수가 필요해 보이지만, 현대 시스템은 일회용 패드를 쓰지 않음
  • 인증 암호화와 스트림 암호를 올바르게 쓰면 256비트 키로 많은 데이터를 현실적으로 안전하게 암호화할 수 있음
  • ChaCha20이나 AES-256-CTR 같은 적절한 스트림 암호를 쓰면 수동 관찰자는 원문을 찾기 위해 약 2^255개 조합을 시도해야 함
  • 키를 아는 사람에게 스트림은 완전히 예측 가능하지만, 키를 모르는 지구 문명 수준의 관찰자에게는 완전히 예측 불가능한 “엔트로피”처럼 동작함
  • 이 방식의 공식 이름은 Cryptographically Secure Pseudo-Random Number Generator, 줄여서 CSPRNG

실제 난수 생성과 fast key erasure

  • 256비트 마스터 키 하나에서 필요한 무작위 수를 파생하려면 마스터 서버나 하드웨어 보안 모듈에 마스터 키를 두고, 로컬 키 스트림을 생성해 회사 전체에 안전하게 배포할 수 있음
  • 각 서버나 CPU 코어는 256비트 로컬 키와 카운터로 필요한 만큼 무작위 바이트를 생성할 수 있음
  • 핵심 문제는 안전한 배포가 매우 어렵다는 데 있음
  • 로컬 키가 유출되면 해당 머신이 과거에 암호화한 모든 메시지와 앞으로 암호화할 메시지가 위험해지고, 마스터 키가 유출되면 피해가 훨씬 커짐
  • fast key erasure는 키 유출 가능성과 유출 시 피해를 줄이기 위한 절차임
    • 512바이트 버퍼 시작 부분에 32바이트 무작위 시드를 둠
    • 그 시드로 512바이트를 생성해 버퍼를 덮어씀
    • 첫 32바이트를 제외한 나머지를 요청에 따라 출력한 뒤 지움
    • 버퍼를 다 쓰면 다시 생성 단계로 돌아감
  • “erasure”는 생성 단계가 기존 키를 지워버리는 데서 나옴
  • 버퍼가 유출되면 미래 메시지는 위험해질 수 있지만, 이미 출력되고 지워진 과거 값은 보호됨
  • 더 중요한 주의점은 버퍼를 복제하지 않는 것임
    • 같은 시드로 두 스트림을 만들지 않아야 함
    • 프로세스를 포크할 때 스트림을 적절히 둘로 나눠야 함
  • 같은 스트림이 둘 이상 생기면 동일한 무작위 바이트가 반복되어 치명적일 수 있음
  • 이 때문에 사용자 공간 RNG는 권장되지 않으며, 커널 RNG는 쉽지는 않아도 감사해야 할 대상 수가 더 적음

스트림 암호 선택과 보안 여유

  • 기반 스트림 암호의 내부 블록 크기도 중요함
  • ChaCha20의 512비트 블록은 걱정하지 않아도 될 만큼 크고, AES의 128비트 블록도 충분히 큼
  • AES에는 단순 무차별 대입보다 성공 확률이 훨씬 나은 현실적 공격이 있으며, AES-128은 깨질 수 있지만 AES-256은 안전하다고 봄
  • 더 작은 블록 크기는 이 용도에서는 깨진 것으로 봐야 함
  • 권장 선택지는 ChaCha20 또는 AES-256이며, 선호는 ChaCha20 쪽임
  • 현대 스트림 암호는 매우 안전하고, 학술 문헌과 여러 정부, 특히 미국의 사용 사례까지 고려하면 가까운 미래에 깨질 가능성은 매우 낮다고 봄
  • CSPRNG와 암호화가 모두 암호에 의존하므로, 그중 하나가 깨지면 전체 시스템도 깨짐
  • AES-256이나 ChaCha20이 가까운 미래에 깨질 가능성이 의미 있게 있다고 가정한다면 보안 여유를 늘리는 선택지는 있음
    • CSPRNG와 암호화에 같은 암호를 쓰면 공격자가 AES와 ChaCha 중 하나만 깨면 되는 선택지를 없애고 특정 하나를 깨야 하게 만듦
    • 라운드 수를 늘리면 무차별 대입 비용뿐 아니라 무차별 대입보다 나은 공격을 막는 데 도움이 됨
    • AES-256은 14라운드, ChaCha20은 20라운드를 사용함
    • ChaCha7에는 exhaustive search보다 나은 공격이 있지만, ChaCha8에는 현재 그런 공격이 없음
    • ChaCha20은 20라운드를 사용해 갑자기 12라운드 공격이 발견되더라도 문제가 없도록 여유를 둠
  • 여러 시스템을 병렬로 쓰는 방식은 전체 복잡도를 크게 높이고, 그 복잡도가 구성 요소 중 하나에 대한 수학적 공격보다 치명적 취약점을 만들 가능성이 더 큼

물리적 true RNG와 초기 시드

  • 물리적 true RNG가 이론적으로 깨질 수 있는 CSPRNG보다 더 안전하다는 생각은 조심해야 함
  • 무작위 출력은 보안을 위해 탐지 가능한 편향이 없어야 하는 경우가 많으며, 이는 2^64개 샘플을 분석해도 편향을 감지할 수 없을 정도로 균일한 분포를 뜻함
  • 물리 과정을 그런 수준으로 조정하기는 어렵기 때문에 실제로는 노이즈 소스 출력을 암호학적 해시로 통과시켜야 함
  • fast key erasure를 쓰는 스트림 암호와 비교하면 보안 증가는 작고, 필요에 따라 성능 비용은 클 수 있음
  • 임의의 양의 무작위 수를 만들려면 처음 몇 바이트의 시드는 필요함
  • 예측 불가능한 소스를 충분히 오래 디지털 기록해 256비트 이상의 엔트로피를 얻고, 그 기록을 SHA-256이나 BLAKE2s 같은 256비트 해시로 해시하면 마스터 시드를 만들 수 있음
  • 가능한 무작위 소스는 hardware random number generator, CPU jitter, 임의의 나무 사진, beam splitter, 키 입력이나 마우스 이벤트, 주사위 등임
  • 사이트 간 무작위 수 배포는 실용적이지 않고, 복잡할 뿐 아니라 침해 원인이 될 수 있음
  • 무작위 수는 한 번만 필요한 것이 아니라 침해가 의심되거나 중요한 보안 업데이트를 할 때마다 필요함
  • 번거로움과 위험을 줄이려면 외부에서 가져오기보다 해당 컴퓨터가 직접 사용할 무작위 시드를 생성하는 편이 대체로 더 좋음
  • 일반적인 서버에는 CPU jitter, 주변장치 상호작용, 네트워크 이벤트가 있어 보통 용도에는 충분함
  • 추가 보안을 원하면 서버 랙마다 하드웨어 RNG 동글 몇 개를 더할 수 있지만, 그보다 복잡한 방식은 불필요한 복잡성임

Lava lamp 벽이 불필요한 이유

  • Cloudflare의 lava lamp 벽은 필요하지 않으며, 로컬 네트워크를 통해 서버에 연결하면 추가 복잡성과 공격 표면만 늘어남
  • 제대로 구현하면 위험은 매우 낮을 수 있지만, 그래도 얻는 이익보다 위험이 큼
  • Cloudflare가 보안에 진지하다면 lava lamp 사용을 중단하고, 장식과 마케팅 용도로만 남겨야 함
  • 서버는 각자 직접 무작위 수를 생성하는 편이 더 단순하고 더 안전함
  • Cloudflare가 이미 그렇게 하고 있을 가능성도 있음
Read Entire Article