상세 컨텐츠

본문 제목

얼굴인증 시스템에 5가지 적대적 공격을 걸고 방어를 우회해본 기록

보안

by 코드스키 2026. 7. 29. 10:38

본문

한이음 ICT 멘토링에서 공격·방어·개발 3인이 팀을 이뤄 얼굴인증 시스템의 적대적 공격과 방어를 다루는 프로젝트를 했다. 나는 공격 파트를 맡았다. 여기서는 실제로 어떤 공격을 만들었고, 방어팀이 붙인 방어를 어떤 조건에서 뚫었는지, 숫자와 함께 정리한다. 사용한 모델과 데이터셋은 모두 공개 연구용 자원이고, 실제 서비스나 타인의 인증 시스템을 공격한 것은 아니다.

얼굴인증 시스템에 5가지 적대적 공격을 걸고 방어를 우회해본 기록 대표 이미지
얼굴인증 시스템에 5가지 적대적 공격을 걸고 방어를 우회해본 기록 대표 이미지

파이프라인 구조

공격은 크게 두 갈래로 나눴다. 하나는 LFW 얼굴 10인 분류 모델에 대한 targeted 공격 5종 비교, 다른 하나는 FaceNet 기반 얼굴 검증(1:1 인증)에 adaptive 공격을 걸어 방어팀의 입력 변환 방어를 우회하는 실험이다. 전체 흐름은 이렇게 잡았다.

공격 파트 파이프라인: FaceNet 인증 baseline → 표적 사칭 공격 생성 → 방어 내성 평가 → 공격 포렌식
공격 파트 파이프라인: FaceNet 인증 baseline → 표적 사칭 공격 생성 → 방어 내성 평가 → 공격 포렌식

Source 얼굴과 Target(사칭하려는) 얼굴을 넣고 baseline 유사도를 먼저 재고, 그 다음 공격으로 유사도를 임계값 위로 밀어올린다. 방어가 붙어 있으면 그 위에서 다시 판정하고, 마지막에 threshold margin·L2/Linf·query 수 같은 값을 남겨 포렌식 자료로 정리했다.

5가지 공격을 같은 조건으로 비교했다

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 eps=0.005 공격 예시: 소스 이미지를 최소한으로 흔들어 타깃 얼굴에 대한 FaceNet 유사도를 끌어올림
PGD eps=0.005 공격 예시: 소스 이미지를 최소한으로 흔들어 타깃 얼굴에 대한 FaceNet 유사도를 끌어올림

PGD 예시 이미지를 보면 사람 눈에는 원본과 거의 구별이 안 가는데, Perturbation 채널만 따로 보면 이미지 전체에 저주파 노이즈가 고르게 퍼져 있는 게 보인다. eps를 낮게 잡아도(0.005) 반복 최적화(PGD)를 쓰면 표적 얼굴 쪽으로 임베딩을 충분히 밀어붙일 수 있다는 뜻이다.

방어를 우회하는 게 진짜 재미있던 부분

방어팀은 JPEG 압축, bit-depth 축소, Gaussian smoothing 세 가지 입력 변환 방어를 붙였다. 일반 PGD를 그대로 방어에 통과시키면 어떻게 되는지 먼저 봤다.

5개 공격 x 3개 방어 조합의 방어 성공률과 복구율 히트맵
5개 공격 x 3개 방어 조합의 방어 성공률과 복구율 히트맵

대체로 방어 성공률이 80~93%대로 높았다. 특히 JSMA 변형과 PGD는 세 방어 모두에서 84~93%대로 잘 막혔다. 그런데 이건 공격이 방어의 존재를 모르는 상태에서 만든 결과였다. 그래서 "공격이 방어를 알고 있다면 어떻게 될까"를 따로 실험했다.

Adaptive PGD로 Gaussian Smoothing을 무력화하다

같은 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)을 두 조건에서 동일하게 유지한 것이 결과의 신뢰도를 만들었다.

공식 자료

관련글 더보기