Expert 1: ⏱️ Side-Channel Attacks - Mencuri Kunci Lewat Waktu Eksekusi
Target: Mengeksploitasi informasi dari fisik/timing - bukan dari matematika cipher
Tools:python3
Praktikum
Side-channel attack tidak menyerang algoritma, tapi implementasi fisik: timing, power consumption, electromagnetic radiation, suara.
cd ~ && mkdir crypto-exp1 && cd crypto-exp1
python3 << 'PYEOF'
import time, string, sys
# === VULNERABLE: Timing-dependent password check ===
def check_password_vuln(stored, attempt):
"""Vulnerable: returns early when character mismatch!"""
if len(stored) != len(attempt):
return False
for i in range(len(stored)):
if stored[i] != attempt[i]:
return False # ← Returns INSTANTLY!
time.sleep(0.001) # simulate work
return True
# === SECURE: Constant-time password check ===
def check_password_secure(stored, attempt):
"""Secure: always takes same time regardless of match position"""
if len(stored) != len(attempt):
return False
result = 0
for i in range(len(stored)):
result |= ord(stored[i]) ^ ord(attempt[i])
return result == 0
# === ATTACK: Timing Attack ===
real_password = "abcdefgh"
print(f"Real password: {real_password}")
print()
print("=== Timing Attack ==*")
print("Mengukur waktu untuk setiap tebakan byte pertama...")
print()
# Tebak byte pertama
timings = []
for c in string.printable[:95]:
attempt = c + "a" * 7 # tebak byte 1, sisanya dummy
start = time.perf_counter_ns()
check_password_vuln(real_password, attempt)
elapsed = time.perf_counter_ns() - start
timings.append((elapsed, c))
# Urutkan berdasarkan waktu (paling lama = byte benar!)
timings.sort(reverse=True)
print(f"Byte pertama: '{timings[0][1]}' (waktu: {timings[0][0]} ns) - benar!")
print(f"Byte kedua: '{timings[1][1]}' (waktu: {timings[1][0]} ns)")
print()
print("✅ Dengan mengukur timing, attacker bisa menebak")
print(" password byte-per-byte dalam ~26 percobaan per byte!")
print(" Total: 26 × 8 = 208 percobaan (vs 26^8 brute force)")
print()
# Secure version - timing constant
print("=== Constant-Time Verification ==*")
print("Dengan check_password_secure(), waktu konstan")
print("untuk setiap input - tidak ada informasi bocor via timing!")
check_password_secure(real_password, "a" * 8) # warmup
PYEOF
Temuan
| Side-Channel | Informasi Bocor | Contoh Nyata |
|---|---|---|
| Timing | Waktu eksekusi | OpenSSL HMAC (CVE-2009-1385) |
| Power | Konsumsi daya | Smart card key extraction |
| EM | Radiasi elektromagnetik | CRT monitor reading |
| Acoustic | Suara komponen | CPU key extraction via fan noise |
| Cache | Waktu akses memory | Meltdown/Spectre |
Refleksi: Side-channel attacks adalah alasan kenapa kriptografi harus constant-time. Implementasi yang benar secara matematis tetap bisa bocor melalui timing, power, atau EM. Mitigasi: constant-time comparison, blinding, noise injection.
Generated by @farishhz Agent Pentest Pipeline - TDCTF Security Academy