
한이음 ICT 멘토링에서 공격·방어·개발 3인이 팀을 이뤄 얼굴인증 시스템의 적대적 공격과 방어를 다루는 프로젝트를 했다. 나는 공격 파트를 맡았다. 여기서는 실제로 어떤 공격을 만들었고, 방어팀이 붙인 방어를 어떤 조건에서 뚫었는지, 숫자와 함께 정리한다. 사용한 모델과 데이터셋은 모두 공개 연구용 자원이고, 실제 서비스나 타인의 인증 시스템을 공격한 것은 아니다.
공격은 크게 두 갈래로 나눴다. 하나는 LFW 얼굴 10인 분류 모델에 대한 targeted 공격 5종 비교, 다른 하나는 FaceNet 기반 얼굴 검증(1:1 인증)에 adaptive 공격을 걸어 방어팀의 입력 변환 방어를 우회하는 실험이다. 전체 흐름은 이렇게 잡았다.
Source 얼굴과 Target(사칭하려는) 얼굴을 넣고 baseline 유사도를 먼저 재고, 그 다음 공격으로 유사도를 임계값 위로 밀어올린다. 방어가 붙어 있으면 그 위에서 다시 판정하고, 마지막에 threshold margin·L2/Linf·query 수 같은 값을 남겨 포렌식 자료로 정리했다.
ResNet-50 기반 얼굴 분류 모델(LFW-10, ImageNet 사전학습 후 파인튜닝)에 FGSM, PGD, Square Attack, JSMA 변형, ZOO-style 공격을 모두 targeted 설정으로 구현했다. 테스트셋 223장 전체에 대해 평가했고, 원본을 모델이 맞힌 샘플(170/223, clean accuracy 76.23%)을 기준으로 공격 성공률을 쟀다.
| 공격 | 설정 | Target ASR (clean 기준) | 평균 L2 | 평균 query |
|---|---|---|---|---|
| FGSM | eps=0.005 | 27.65% | 1.89 | - |
| PGD | eps=0.030, steps=10 | 100.00% | 3.56 | - |
| Square | eps=0.050, queries=300 | 59.41% | 10.76 | 190.77 |
| JSMA 변형 | theta=0.050, k=200 | 99.41% | 1.97 | - |
| ZOO-style | eps=0.050, queries=2000 | 7.06% | 0.58 | 1891.51 |
white-box 계열(모델 gradient에 접근 가능)인 PGD와 JSMA 변형이 각각 100%, 99.41%로 거의 모든 표적 사칭에 성공했다. 반면 black-box 계열은 갈렸다. Square Attack은 평균 190회 남짓한 질의로 59.41% 성공률을 냈는데, ZOO-style은 그보다 10배 많은 질의(1891회)를 쓰고도 7.06%에 그쳤다. 같은 black-box라도 gradient를 유한차분으로 근사하는 방식(ZOO)이 무작위 섭동을 진화시키는 방식(Square)보다 이 설정에서는 훨씬 비효율적이었다.
PGD 예시 이미지를 보면 사람 눈에는 원본과 거의 구별이 안 가는데, Perturbation 채널만 따로 보면 이미지 전체에 저주파 노이즈가 고르게 퍼져 있는 게 보인다. eps를 낮게 잡아도(0.005) 반복 최적화(PGD)를 쓰면 표적 얼굴 쪽으로 임베딩을 충분히 밀어붙일 수 있다는 뜻이다.
방어팀은 JPEG 압축, bit-depth 축소, Gaussian smoothing 세 가지 입력 변환 방어를 붙였다. 일반 PGD를 그대로 방어에 통과시키면 어떻게 되는지 먼저 봤다.
대체로 방어 성공률이 80~93%대로 높았다. 특히 JSMA 변형과 PGD는 세 방어 모두에서 84~93%대로 잘 막혔다. 그런데 이건 공격이 방어의 존재를 모르는 상태에서 만든 결과였다. 그래서 "공격이 방어를 알고 있다면 어떻게 될까"를 따로 실험했다.
같은 PGD 옵티마이저를 두 가지 방식으로 돌렸다. 하나는 방어를 모르는 Plain PGD, 다른 하나는 공격 루프 안에 Gaussian smoothing을 미리 넣어서 "블러를 견디는 방향으로" 최적화하는 Adaptive PGD다. FaceNet(vggface2) 임베딩과 코사인 유사도 임계값 0.4797을 기준으로 100쌍씩 같은 조건에서 비교했다.
| eps | 공격 | raw 성공 | 방어 후 성공 | 우회율 |
|---|---|---|---|---|
| 0.005 | Plain | 57/100 | 2/100 | 3.5% |
| 0.005 | Adaptive | 3/100 | 0/100 | 0.0% |
| 0.010 | Plain | 86/100 | 2/100 | 2.3% |
| 0.010 | Adaptive | 6/100 | 4/100 | 66.7% |
| 0.020 | Plain | 100/100 | 4/100 | 4.0% |
| 0.020 | Adaptive | 25/100 | 24/100 | 96.0% |
Plain PGD는 eps를 아무리 키워도 smoothing 방어에 거의 다 걸렸다(우회율 2~4%). 반면 Adaptive PGD는 eps=0.020에서 raw 성공률 자체는 25%로 낮았지만, 방어를 통과한 뒤에도 24개가 살아남아 우회율이 96%까지 뛰었다. 방어 없는 조건만 보면 Adaptive가 Plain보다 훨씬 약해 보이는데(raw 25 vs 100), 방어가 붙는 순간 우위가 완전히 뒤집혔다.
이 결과에서 얻은 결론은 "smoothing 하나로 막았다"고 안심하면 안 된다는 것이었다. 공격자가 방어의 존재를 알고 그 방어를 손실 함수에 포함시켜 최적화하면(adaptive), 단일 입력 변환 방어는 상당히 쉽게 뚫린다. 다층 방어나 생성형 정화(DAE, DiffPure 계열)처럼 adaptive 공격 기준으로도 평가된 방어를 검토할 필요가 있다는 게 팀 결론이었다.
나는 공격 5종의 구현·평가와 adaptive bypass 분석을 맡았다. Gaussian/bit-depth/JPEG 방어 구현과 방어 측 평가 파이프라인은 방어 담당 팀원이, 통합 대시보드와 산출물 정리는 개발 담당 팀원이 맡았다. 위 수치는 전부 우리 팀이 직접 돌린 실험 결과이고, 벤치마크 재현 조건(같은 100쌍, 같은 steps/alpha)을 두 조건에서 동일하게 유지한 것이 결과의 신뢰도를 만들었다.
| 취약점 심각도를 정직하게 매기기 — RCE라고 부풀리지 않으려고 한 일들 (0) | 2026.07.28 |
|---|---|
| SSH 끊어도 죽지 않는 퍼징 캠페인 만들기 (nohup은 왜 죽었나) (0) | 2026.07.28 |
| EDR 탐지 아이디어를 검증 가능한 결과로 만든 팀 프로젝트 회고 (0) | 2026.07.28 |
| 오픈소스 취약점을 GitHub에 책임 있게 제보하기 — PVR이 없을 때 겪은 일들 (0) | 2026.07.27 |
| Boolean Blind SQLi로 한 글자씩 데이터 뽑아내기 — WHS 워게임 5단계 (0) | 2026.07.26 |