"매 알고리즘 의 정상 output 이 아닌 부수 누출 (시간, 전력, 캐시, EM 방사) 로 secret 추출". 매 1996 Kocher 의 timing attack on RSA 가 시초. 매 2018 Spectre/Meltdown 으로 mass awareness. 매 2026 LLM weight extraction, GPU side-channel 까지 확장.
Membership inference: 매 model 출력 으로 training data 멤버 여부 추론.
Model extraction: 매 query → weight stealing.
Prompt injection side-channel: token timing.
매 응용 (defensive)
Constant-time crypto code.
Cache partitioning.
KASLR + KPTI (Meltdown 대응).
Differential privacy (ML).
💻 패턴
Timing-vulnerable string compare
// VULNERABLE
intcompare_password(constchar*a,constchar*b,size_tn){for(size_ti=0;i<n;i++){if(a[i]!=b[i])return0;// early exit → timing leak
}return1;}// SAFE — constant time
intsafe_compare(constuint8_t*a,constuint8_t*b,size_tn){uint8_tdiff=0;for(size_ti=0;i<n;i++)diff|=a[i]^b[i];returndiff==0;}
Timing attack demo
importtime,statisticsdefmeasure(guess,target):samples=[]for_inrange(1000):t0=time.perf_counter_ns()compare_password(guess,target)samples.append(time.perf_counter_ns()-t0)returnstatistics.median(samples)# Brute force first byte: char with longest median = correctforcinrange(256):guess=bytes([c])+b'\x00'*15print(c,measure(guess,target_secret))
Constant-time AES (lookup-free)
// Bitsliced implementation — no data-dependent table lookup → no cache leak
// Reference: bsaes (BearSSL)
voidaes_bitsliced_encrypt(uint64_tstate[8],uint64_trk[88]);
Spectre v1 (bounds-check bypass)
// VULNERABLE
if(idx<array_size){y=array2[array1[idx]*256];// speculatively executed even if idx large
}// → array1 OOB read → array2 cache state encodes secret
// Probe shared library page
clflush(&victim_addr);victim_function();// runs in target process
uint64_tt0=rdtsc();volatilecharx=*victim_addr;uint64_tt1=rdtsc();if(t1-t0<THRESHOLD)printf("hit — accessed by victim\n");
매 결정 기준
상황
Approach
Crypto code (key compare, AES)
Constant-time + bitsliced
Web auth
hmac.compare_digest / crypto.timingSafeEqual
Cloud multi-tenant
Cache partitioning + Spectre patches
ML model serving
Output rate-limit + DP training
Embedded HW
Power analysis countermeasures (masking, hiding)
기본값: constant-time primitives + libsodium / BoringSSL 의 사용.