🔌 [최신] SPECTER — 에어갭을 넘는 신호는 '데이터'가 아니라 '전원'이었다

2026-10-22 · 카테고리: Research (최신 보안 논문 · 에어갭 유출 · USB 전원 제어 · 부수 채널 · 하드웨어 보안)

논문 정보

제목: SPECTER: Covert Data Exfiltration from Air-Gapped Systems via USB Power Modulation
저자: Hyeongjun Choi, Ji Hyuk Jung, Ji Won Yoon (Korea University)
출처: arXiv:2610.28401 [cs.CR] · 2026년 10월 20일 제출 · 11 pages, 7 figures, 3 tables
분야: 에어갭/망분리 환경 유출 · USB 전원 관리 · 물리적 부수 채널 · 악성코드 사후(post-compromise) 행위
인용: 2026-10-20 신규 공개 — 인용 집계 전 (OpenAlex/S2 레코드 미형성)
원문: arXiv:2610.28401 · HTML 전문 · 아티팩트 (MIT)

왜 이 논문인가 — "망을 끊었으니 안전하다"의 마지막 구멍

에어갭(air-gap)은 보안의 마지막 카드입니다. 원자력·발전 제어망, 국방, 금융 망분리 PC, 제조 OT — "인터넷이 없다"는 한 줄로 위협 모델의 절반을 잘라냅니다. 그래서 지난 10년간 연구자들은 그 카드를 계속 뒤집어 왔습니다. CPU 부하로 열을 만들고(BitWhisper), 자기장을 흘리고(MAGNETO), 내장 스피커를 초음파로 울리고(MOSQUITO), USB 데이터 버스의 전자기 방사를 잡았습니다(USBee).

고려대학교의 Hyeongjun Choi·Ji Hyuk Jung·Ji Won Yoon이 10월 20일 올린 SPECTER는 그 계보에서 한 칸을 비워둔 자리를 채웁니다. 신호를 싣는 곳이 데이터 선(D+/D−, SuperSpeed 페어)도, USB 데이터 전송(payload)도 아닙니다. 호스트가 USB 전원 관리·장치 상태를 바꾸는 그 동작 자체입니다.

핵심 문장은 이겁니다. "유출할 데이터를 USB 데이터 전송 안에 넣지 않는다." USB 트래픽을 전수 감시하는 DLP도, USB 데이터 캡처 기반 탐지기도, 원리적으로 볼 것이 없습니다 — 관찰 대상은 충전 표시등이 켜졌다 꺼졌다 하는 패턴입니다.

위협 모델 — 이미 뚫린 호스트, 남은 것은 '빼내기'뿐

메커니즘 — 5초에 1비트, '전원 상태'를 스위치로 쓴다

송신기는 두 플랫폼에서 각각 다른 프리미티브를 씁니다. 둘 다 관리자 권한이 필요한, 그러나 지극히 정상적인 OS 기능입니다.

플랫폼제어 수단동작
Ubuntu 22.04sysfs 전원 관리 속성power/control = on(활성) / auto(커널이 유휴 장치 서스펜드 허용) · iOS 분기는 autosuspend_delay_ms를 2000 ↔ 0으로 함께 변경
Windows 10DevCon 장치 상태 명령devcon disable "<HWID>" / devcon enable "<HWID>" — enable을 두 번 호출해야 상태가 안정적으로 복구됨(실측)

수신 경로 세 갈래 — 폰, 눈, 그리고 SDR

실측 결과 — 표 두 줄이 이 논문의 전부다

수신 경로Ubuntu 데스크톱Windows 노트북
충전 상태 · Android (Galaxy S22 / Android 14)0.2 bit/s0.25 bit/s
충전 상태 · iPhone (13 Pro / iOS 17.4.1, 육안)0.2 bit/s0.25 bit/s
주변기기 · USB 마우스 (LED 소등 + 응답 정지)N/O1.0 bit/s
주변기기 · 웹캠 (사용 중일 때만 LED 점등)N/O0.25 bit/s
주변기기 · USB 허브 (허브 LED는 계속 켜짐, 하위 장치가 죽음)N/O0.25 bit/s
주변기기 · 키보드 / 헤드셋 동글N/ON/O

N/O = 해당 조합에서 사용 가능한 채널을 얻지 못함. Ubuntu 데스크톱에서는 테스트한 모든 주변기기가 실패했습니다 — 즉 이 채널은 "호스트 + 장치 + 수신 경로의 조합"에 극단적으로 의존합니다. 저자들이 이 사실을 숨기지 않고 표에 그대로 남긴 점이 오히려 신뢰를 높입니다.

어디까지 믿어야 하나 — 저자들이 스스로 깎은 주장

이 논문은 최근 유행하는 "AI가 다 뚫었다"류와 정반대의 태도로 쓰였습니다. 실험실 규모의 사실만 남기고 나머지를 명시적으로 비워둡니다.

방어 — USB '데이터' 감시로는 안 잡힌다

교육용 PoC — 채널을 '만들지' 않고 '탐지'하는 쪽을 짜본다

아래 코드는 실제 하드웨어를 제어하지 않습니다. 로컬 로그 시뮬레이션입니다. (1) 상태 기반 부호화로 비트열이 어떤 이벤트 시퀀스가 되는지 만들고, (2) 그 시퀀스를 방어자 입장에서 "주기적 상태 변경" 패턴으로 탐지합니다. 목적은 탐지 규칙의 취약점을 이해하는 것입니다 — 임계값을 조금만 올리면 공격은 그대로 두고 오탐만 사라집니다.

import statistics

# 1) 상태 기반 부호화: bit1 = 활성(on), bit0 = 비활성(auto)
def encode(bits, period=5.0):
    t, events = 0.0, []
    state = None
    for b in bits:
        new = "on" if b == 1 else "auto"
        if new != state:                    # 상태가 바뀔 때만 실제 이벤트 발생
            events.append((round(t, 1), new))
            state = new
        t += period
    return events

secret = [int(c) for c in "10110011"]        # 교육용 8비트
ev = encode(secret, period=5.0)
print(ev)

# 2) 방어자 측 휴리스틱: '같은 장치의 상태 변경 간격이 규칙적인가'
def detect(events, min_events=5, cv_threshold=0.15):
    if len(events) < min_events:
        return "PASS (이벤트 부족)"
    gaps = [b[0] - a[0] for a, b in zip(events, events[1:])]
    cv = statistics.pstdev(gaps) / statistics.mean(gaps)   # 변동계수
    return ("ALERT: 주기적 USB 상태 변경 (간격 CV=%.2f)" % cv) if cv < cv_threshold else "PASS"

print(detect(ev))
print(detect([(0,"auto"),(37,"on"),(51,"auto"),(180,"on"),(181,"auto")]))  # 정상 재연결

그래서 무엇이 남는가

출처

목록으로 돌아가기