적대적 공격
Adversarial Attack
AI 모델을 속이기 위한 의도적 입력 조작. 보안 위협.
Adversarial Attack
AI 모델을 속이기 위한 의도적 입력 조작. 보안 위협.
적대적 공격(Adversarial Attack)은 AI 모델을 의도적으로 속이기 위해 입력 데이터를 조작하는 기법입니다. 사람의 눈에는 거의 차이가 없지만 AI에게는 완전히 다른 결과를 유도하는 교묘한 변조를 가합니다. 예를 들어, 정지 표지판 이미지에 특정 패턴의 스티커를 붙이면 자율주행차가 이를 속도 제한 표지판으로 오인식하게 만들 수 있습니다.
적대적 공격은 크게 화이트박스와 블랙박스로 나뉩니다. 화이트박스 공격은 모델 구조와 가중치를 알고 있을 때 그래디언트 정보를 활용하여 최적의 perturbation을 계산합니다. 대표적으로 FGSM(Fast Gradient Sign Method), PGD(Projected Gradient Descent) 등이 있습니다. 블랙박스 공격은 모델 내부를 모르는 상태에서 입출력만 관찰하여 공격하는 방식입니다.
LLM에 대한 적대적 공격도 활발히 연구되고 있습니다. Jailbreak 공격은 프롬프트를 조작하여 안전 가이드라인을 우회하고, Prompt Injection은 외부 데이터에 악성 명령을 삽입하여 모델을 조종합니다. 이러한 공격은 AI 시스템의 보안과 신뢰성에 심각한 위협이 될 수 있습니다.
방어 기법으로는 적대적 학습(Adversarial Training), 입력 정제(Input Sanitization), 앙상블 방어 등이 있습니다. 그러나 공격과 방어는 끊임없는 군비 경쟁 양상을 보이며, 완벽한 방어는 아직 불가능합니다. AI 시스템 배포 시 적대적 공격에 대한 robustness 테스트가 필수적입니다.
PyTorch를 사용한 FGSM 적대적 공격 시연 예제입니다. (교육 목적)
import torch
import torch.nn.functional as F
from torchvision import models, transforms
from PIL import Image
# FGSM 적대적 공격 구현
def fgsm_attack(image, epsilon, gradient):
"""
image: 원본 이미지 텐서
epsilon: perturbation 크기 (작을수록 탐지 어려움)
gradient: 손실에 대한 이미지의 그래디언트
"""
# 그래디언트 부호 방향으로 perturbation 생성
perturbation = epsilon * gradient.sign()
# 적대적 이미지 생성
adversarial_image = image + perturbation
# 픽셀 값 범위 제한 [0, 1]
adversarial_image = torch.clamp(adversarial_image, 0, 1)
return adversarial_image
# 적대적 예제 생성 함수
def generate_adversarial_example(model, image, target_label, epsilon=0.03):
model.eval()
image.requires_grad = True
# 순전파
output = model(image)
loss = F.cross_entropy(output, target_label)
# 역전파로 그래디언트 계산
model.zero_grad()
loss.backward()
# FGSM 공격 적용
adversarial = fgsm_attack(image, epsilon, image.grad.data)
return adversarial
# 방어: 적대적 학습 (Adversarial Training)
def adversarial_training_step(model, images, labels, epsilon=0.03):
"""적대적 예제를 포함한 학습"""
# 원본 이미지로 손실 계산
outputs = model(images)
loss_clean = F.cross_entropy(outputs, labels)
# 적대적 예제 생성
adv_images = generate_adversarial_example(model, images.clone(), labels, epsilon)
# 적대적 이미지로 손실 계산
outputs_adv = model(adv_images)
loss_adv = F.cross_entropy(outputs_adv, labels)
# 총 손실 (원본 + 적대적)
total_loss = loss_clean + loss_adv
return total_loss
# Robustness 테스트
def test_robustness(model, test_loader, epsilons=[0, 0.01, 0.03, 0.05]):
for eps in epsilons:
correct = 0
total = 0
for images, labels in test_loader:
if eps > 0:
images = generate_adversarial_example(model, images, labels, eps)
outputs = model(images)
_, predicted = outputs.max(1)
correct += (predicted == labels).sum().item()
total += labels.size(0)
print(f"Epsilon={eps:.2f}: Accuracy={100*correct/total:.1f}%")
| 공격 유형 | 대상 | 방식 | 방어 난이도 |
|---|---|---|---|
| FGSM | 이미지 분류 | 1회 그래디언트 스텝 | 중간 |
| PGD | 이미지 분류 | 반복 최적화 | 높음 |
| Patch Attack | 객체 탐지 | 물리적 패치 부착 | 매우 높음 |
| Jailbreak | LLM | 프롬프트 조작 | 높음 |
| Prompt Injection | LLM/RAG | 악성 명령 삽입 | 매우 높음 |
"배포 전에 적대적 공격에 대한 robustness 테스트가 필요합니다. FGSM, PGD로 epsilon 0.03까지 테스트하고 정확도 하락폭을 측정해야 합니다."
"RAG 시스템에서 prompt injection 위험이 있습니다. 외부 문서에서 가져온 텍스트를 별도 구분자로 감싸고, 시스템 프롬프트를 강화해야 합니다."
"적대적 학습을 적용해서 robustness를 높입시다. 학습 시간이 2배 늘어나지만, 적대적 공격에 대한 저항력이 크게 향상됩니다."
정확도만 측정하고 배포하면 공격에 취약합니다. 다양한 epsilon 값으로 적대적 테스트를 수행하세요.
한 모델에서 만든 적대적 예제가 다른 모델도 속일 수 있습니다. 블랙박스 환경도 안전하지 않습니다.
LLM에 사용자 입력을 그대로 전달하면 injection에 취약합니다. 입력 정제 및 검증 로직을 추가하세요.
적대적 학습은 정상 입력 정확도를 낮출 수 있습니다. 보안과 성능 간 적절한 균형을 찾으세요.