
취약한 C 서버와 Python 공격 스크립트를 사용하여 Kyber KEM 역캡슐화(decapsulation)의 타이밍 부채널을 시연하고, 암호문 거부 타이밍을 측정해 개인 키를 복구합니다.
Kyber KEM 역캡슐화의 취약한 구현은 암호문 거부 단계의 타이밍 차이를 통해 비밀 키 비트를 유출하여 전체 키 복구를 가능하게 합니다.
심각도: 치명적 (개인 키 손상)
// kyber_vuln_decaps.c - Simulated vulnerable Kyber decapsulation
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <time.h>
// Secret key (simplified, 16 bytes for demo)
static uint8_t secret_key[16] = {
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
};
// Vulnerable decapsulation: processes ciphertext and returns shared secret
// but timing leaks bit-by-bit comparison of a re-encrypted value.
int vulnerable_decaps(uint8_t *ct, uint8_t *shared_secret_out) {
// Simulate re-encryption: compare ct with a computed value byte by byte
uint8_t re_enc[16];
for (int i = 0; i < 16; i++) {
re_enc[i] = secret_key[i] ^ 0x55; // dummy computation
}
// Timing leak: early exit on first mismatch
for (int i = 0; i < 16; i++) {
if (ct[i] != re_enc[i]) {
return -1; // rejection, faster when mismatch early
}
}
memcpy(shared_secret_out, secret_key, 16);
return 0;
}
int main() {
// simulate receiving a ciphertext (hardcoded for demo)
uint8_t ct[16] = {0}; // attacker will probe
uint8_t shared[16];
int res = vulnerable_decaps(ct, shared);
// Timing measured externally
return 0;
}
Kyber 포스트퀀텀 KEM의 한 구현이 역캡슐화 과정에서 상수 시간 비교를 사용하지 않습니다. 공격자는 거부된 암호문의 실행 시간을 측정하여 전체 개인 키를 반복적으로 복구할 수 있습니다.
gcc -shared -o kyber_vuln.so -fPIC kyber_vuln_decaps.c
python timing_attack.py