본문으로 건너뛰기

44. 암호학 공격 기법 입문: Padding Oracle부터 Bit-Flipping까지

암호문이 보인다고 곧바로 공격 가능한 것은 아니다. 먼저 공격자가 암호문을 바꿀 수 있는지, 복호화 결과를 관찰할 수 있는지, 키와 nonce가 어떻게 관리되는지를 분리해 모델링해야 한다. 다음 내용은 Cryptopals 같은 교육용 문제와 승인된 테스트 시스템을 위한 분석 틀이다.

CBC에서 무엇이 새는가

AES-CBC에서 블록 C_i의 복호화는 P_i = D_K(C_i) XOR C_{i-1}이고, 첫 블록에서는 C_0이 IV다. 따라서 이전 블록을 바꾸면 다음 평문 블록의 해당 바이트가 예측 가능하게 바뀐다. 이것은 기밀성만 제공하는 CBC의 성질이지, 그 자체로 평문을 읽는 방법은 아니다.

패딩 오라클은 서버가 “패딩이 맞다/틀리다”를 구별 가능한 응답으로 노출할 때 성립한다. 상태 코드, 본문 길이, 오류 메시지, 지연이 모두 오라클이 될 수 있다. 실습에서는 서버에 무제한 요청을 보내기보다, 블록 크기와 패딩 규칙을 문서화하고 요청 수와 오류율을 제한한다. 복호화 성공을 의미하는 응답이 아니라 “패딩 검증 결과가 다른가”를 측정해야 한다.

방어는 인증을 복호화보다 먼저 믿는 것이다. 오늘날 새 설계에서는 AES-GCM이나 ChaCha20-Poly1305 같은 AEAD를 사용하고, 레거시 CBC를 유지해야 한다면 Encrypt-then-MAC, 일정한 오류 응답, 요청 속도 제한을 적용한다. HMAC 검증은 평문을 사용하기 전에 실패해야 한다.

Bit-flipping의 조건과 한계

CBC에서 이전 블록의 바이트를 delta = old_plain XOR new_plain만큼 바꾸면 다음 블록의 같은 위치가 원하는 값으로 바뀐다. 그러나 이전 블록 자체는 무작위로 깨진다. 또한 패딩이 손상되거나 MAC 검증이 있으면 요청은 거부된다. 그러므로 “CBC면 권한 상승”은 잘못된 결론이다. 공격이 가능한지 판단하려면 조작 위치가 경계 안에 있고, 서버가 변경된 평문을 인증 전에 사용하며, 의미 있는 검증 우회가 가능한지 모두 확인해야 한다.

ECB와 구현 검증

ECB는 같은 평문 블록을 같은 암호문 블록으로 바꾸므로 반복 패턴이 노출된다. 파일이나 이미지에서 패턴이 보이는 예는 직관적이지만, 짧고 무작위인 토큰의 위험을 과장하는 근거는 아니다. 실제 판단은 평문 블록의 반복성과 토큰 형식, 암호화 범위를 확인해 내린다. Base64는 암호화가 아니며, IV가 앞에 붙었다고 무결성이 생기는 것도 아니다.

연습 코드에서는 암호화·복호화·검증을 각각 테스트하고, 변조된 ciphertext·IV·태그에 모두 실패하는지 확인한다. 공격 기법의 이름을 나열하는 것보다, 관찰 가능한 오라클과 무결성 경계가 어디인지 설명하는 것이 재현 가능한 분석이다.