0Pricing
Cryptology Academy · 강의

애플리케이션 수준 코드의 타이밍 공격

문자열 비교 시간에서 비밀 정보가 유출되는 방식과 일정 시간 비교로 이를 방지하는 방법을 학습합니다.

애플리케이션 수준 코드의 타이밍 공격은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

상수 시간이 아닌 문자열 비교

대부분의 프로그래밍 언어에서 표준 문자열 동등성 연산자는 불일치를 발견하는 즉시 실행을 종료합니다. Python의 바이트 객체에 대한 ==, C의 strcmp, Java의 String.equals는 처음으로 서로 다른 바이트를 발견하면 즉시 반환합니다. 일반적인 문자열 비교에서는 이것이 최적화이지만, MAC 태그나 비밀번호 같은 비밀 값을 비교할 때는 측정 가능한 시간 부채널이 생성되어 정보가 유출됩니다.

HMAC 비교 시간 측정

공격자는 제출한 HMAC 태그를 올바른 값과 비교하는 데 걸리는 시간을 측정합니다. 첫 번째 바이트가 올바르게 일치하는 HMAC를 제출하면 첫 번째 바이트가 틀린 경우보다 약간 더 오래 걸립니다(바이트 비교가 한 번 더 수행되기 때문입니다). 가능한 첫 번째 바이트를 하나씩 넣은 값을 많이 제출하고 응답 시간을 측정하면 공격자는 올바른 첫 번째 바이트를 알아낼 수 있습니다. 이 과정을 바이트 단위로 반복하면 전체 태그를 복구할 수 있습니다.

실제 공격에 필요한 시간 측정 정밀도

현대의 네트워크 시간 측정 공격은 인터넷을 통해 수십~수백 나노초의 시간 차이까지 구분할 수 있습니다. 올바른 바이트 하나마다 처리 시간이 약 10~100ns씩 늘어나는 32바이트 HMAC 비교는 충분히 반복 측정하여 네트워크 변동을 평균 내면 측정 가능한 신호를 제공합니다. 로컬 네트워크 환경에서는 통계적 표본을 충분히 수집할 경우 1나노초 정도의 차이도 악용할 수 있습니다.

Python == 연산자의 취약점

Python에서 ==를 사용해 MAC 태그를 비교하는 것은 안전하지 않습니다. MAC 태그와 제출된 MAC 태그를 ==로 비교하면 첫 번째 불일치가 발생한 위치에 따라 참 또는 거짓을 반환합니다. 공격자는 조작한 태그를 수천 개 제출하고 응답 시간을 측정하여 예상 태그를 바이트 단위로 복구할 수 있습니다. 이 취약점은 세션 토큰이나 API 키를 상수 시간 함수 없이 잘못 비교한 실제 운영 웹 애플리케이션에서 발생한 사례가 있습니다.

Python의 hmac.compare_digest

Python의 hmac.compare_digest(a, b)는 처음으로 불일치하는 위치와 관계없이 동일한 시간이 걸리도록 두 바이트 값 또는 문자열 값을 상수 시간으로 비교합니다. Python 바이트코드 해석 오버헤드가 있더라도 상수 시간 동작을 보장하기 위해 C로 구현되어 있습니다. MAC 태그, 세션 토큰, API 키 또는 시간 정보가 노출되면 위험한 모든 값을 비교할 때는 항상 hmac.compare_digest를 사용하십시오.

OpenSSL의 CRYPTO_memcmp

OpenSSL은 상수 시간 메모리 비교를 위한 CRYPTO_memcmp(a, b, length)를 제공합니다. memcmp와 달리 초기에 불일치가 발견되더라도 항상 length 바이트 전체를 처리합니다. 값이 같으면 반환값은 0이고, 다르면 0이 아닌 값입니다. 항상 예상되는 전체 길이를 비교하는 것이 중요합니다. 서로 다른 길이의 값을 더 짧은 길이에 맞춰 비교하면 길이 정보가 여전히 유출될 수 있습니다. OpenSSL을 사용하는 C/C++ 코드에서 보안상 중요한 비교를 수행할 때는 CRYPTO_memcmp를 사용하십시오.

RSA에 대한 시간 측정 공격: Bleichenbacher

시간 측정 공격은 문자열 비교에만 국한되지 않습니다. Bleichenbacher가 2006년에 수행한 RSA PKCS#1 v1.5 복호화 공격은 SSL/TLS 구현을 상대로 한 실용적인 시간 측정 오라클 공격을 입증했습니다. 복호화된 값의 PKCS#1 패딩이 유효한지에 따라 RSA 개인 키 연산에 걸리는 시간이 달라졌습니다. 공격자는 조작한 암호문을 수천 개 제출하여 RSA 개인 키를 복구할 수 있었습니다. 이 공격은 RSA-OAEP와 상수 시간 RSA 구현을 사용하게 된 계기가 되었습니다.

AES에 대한 캐시 시간 측정 공격

조회 테이블을 사용하는 AES 구현(성능을 위해 흔히 사용됨)은 키와 평문에 따라 서로 다른 테이블 항목에 접근합니다. 캐시 적중과 캐시 누락의 차이로 측정 가능한 시간 차이가 발생하며, 이를 통해 어떤 테이블 항목에 접근했는지에 대한 정보가 유출됩니다. 이 부채널은 AES 키를 노출할 수 있습니다. 방어 방법은 AES-NI 하드웨어 명령어나 비트 슬라이스 소프트웨어 구현처럼 테이블 조회에 의존하지 않는 AES 구현을 사용하는 것입니다.

상수 시간 구현 원칙

상수 시간 코드를 작성하려면 다음을 피해야 합니다. 비밀 데이터에 따른 조건부 분기(마스킹을 사용한 분기 없는 선택을 사용하십시오), 비밀 데이터에 따라 달라지는 메모리 접근 패턴(비밀 값을 인덱스로 사용하는 조회 테이블을 피하십시오), 비밀 값에 따라 지연 시간이 달라지는 모든 연산(일부 프로세서에서의 나눗셈 등)입니다. 컴파일러가 상수 시간 구성 요소를 최적화하여 제거할 수 있으므로 중요한 구간에서는 어셈블리나 volatile 메모리 접근이 필요할 수 있습니다.

AEAD로 애플리케이션 수준의 MAC 비교 제거

MAC 비교에 대한 시간 측정 공격을 방어하는 가장 좋은 방법은 AEAD 방식(GCM, ChaCha20-Poly1305)을 사용하고 MAC 검증을 암호 라이브러리에 위임하는 것입니다. 라이브러리 구현은 내부적으로 상수 시간 검증을 수행합니다. AEAD를 올바르게 사용한다면(변조가 발생하면 복호화가 실패하고 태그를 검증하기 전에는 절대 복호화하지 않음) 애플리케이션 코드에서 MAC 태그를 비교할 필요가 전혀 없으므로 시간 측정 취약점이 완전히 제거됩니다.

시간 측정 취약점 테스트

시간 측정 취약점을 테스트하려면 응답 시간 분포를 통계적으로 분석해야 합니다. tlsfuzzer, 시간 측정 공격 테스트 스크립트, dudect 프레임워크 같은 도구는 암호 구현의 시간 차이를 탐지하는 데 도움이 됩니다. 동일한 시간이 걸려야 하는 입력의 응답 시간 표본에 t-검정을 적용하면 통계적으로 유의한 차이를 발견할 수 있습니다. 위음성이 발생할 수 있으므로 테스트와 함께 상수 시간 코드 검토도 반드시 수행해야 합니다.

상수 시간 비교

시간 측정 공격을 방지하면서 HMAC 태그를 안전하게 비교하려면 어떤 Python 함수를 사용해야 합니까?

시간 측정 공격 복습

시간 측정 공격 복습: 조기에 종료되는 문자열 비교는 응답 시간 차이를 통해 비밀 값을 바이트 단위로 유출하며, 충분한 표본을 사용하면 네트워크를 통해 측정할 수 있습니다. 상수 시간 비교에는 Python에서 hmac.compare_digest를 사용하고 OpenSSL에서는 CRYPTO_memcmp를 사용하십시오. RSA 패딩 시간 측정 공격은 개인 키를 손상시킬 수 있으므로 상수 시간 RSA와 OAEP를 사용해야 합니다. AES 테이블 조회 시간 측정 공격은 키 비트를 유출하므로 AES-NI 또는 비트 슬라이스 구현을 사용해야 합니다. AEAD 라이브러리의 검증을 사용하면 애플리케이션 수준에서 MAC을 비교할 필요가 없습니다.

자주 묻는 질문

“애플리케이션 수준 코드의 타이밍 공격” 강의는 무료인가요?

네 — “애플리케이션 수준 코드의 타이밍 공격” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“애플리케이션 수준 코드의 타이밍 공격”에서 뭘 배우나요?

문자열 비교 시간에서 비밀 정보가 유출되는 방식과 일정 시간 비교로 이를 방지하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“애플리케이션 수준 코드의 타이밍 공격” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 패딩 오라클 공격 자세히 알아보기
  2. 재생 공격과 논스 재사용 취약점
  3. 애플리케이션 수준 코드의 타이밍 공격
  4. 주요 암호 오용 패턴
← Cryptology Academy(으)로 돌아가기