🧾 전자금융 보안 모의해킹 · 거래정보 무결성 검증 (전문 변조)
Target: Core Banking 이체 API
평가기준: 위험도 5 WEB-SER 거래정보 검증
평가기준: 위험도 5 WEB-SER 거래정보 검증
💡 쉽게 말하면
송금 쪽지를 봉인 없이 보내면, 배달부가 금액을 100만 → 5천만으로 고쳐도 은행은 모릅니다. 거래정보에 봉인(전자서명·HMAC)을 붙여야 위조를 잡아냅니다.
송금 쪽지를 봉인 없이 보내면, 배달부가 금액을 100만 → 5천만으로 고쳐도 은행은 모릅니다. 거래정보에 봉인(전자서명·HMAC)을 붙여야 위조를 잡아냅니다.
🔓 공격 시뮬레이션 (Red Team)
🛡️ 대응 방안 (Blue Team)
계좌 이체 요청🔒 Secured Channel
사용자가 입력한 거래정보(이체금액·수취계좌)가 단말에서 서버로 전송될 때 무결성 검증(서명/HMAC) 없이 처리되면, 프록시로 가로채 이체금액을 변조해도 서버가 그대로 승인합니다.
⚡ 이체 전문(Amount) 변조
amount 10,000 → 50,000,000 변조 후 재전송
amount 10,000 → 50,000,000 변조 후 재전송
OFF
🖥️ 금융 시스템 처리 로그
[SYSTEM] Core Banking Channel ready.
[INFO] 거래 요청 대기 중...
⚖️ 컴플라이언스 위반 분석
공격 실행 후 분석 결과가 표시됩니다.
[심각] 전자금융 보안 기준 위반 감지
- 전자금융감독규정 제34조: 거래정보의 무결성 확보 미흡
- 평가기준 WEB/MOB/HTS-SER [전자금융] 거래정보 무결성 검증(위험도 5)
- 예비거래↔본거래 거래정보 일치 검증 부재
🛡️ 대응 코드/설정 실습
서버는 클라이언트 입력 금액을 신뢰하지 말고, 거래정보에 대한 전자서명/HMAC 무결성 검증과 예비거래 대조를 수행해야 합니다. 아래 검증 로직을 안전하게 보완하세요.
📚 금융보안원 평가기준 / 조치 가이드
1. 점검 항목
운영 관리 > 공개서버 보안 > 거래정보 무결성 검증2. 위험 분석
- 이체금액·수취계좌 변조로 직접적 금전 피해
- 유료 인증서 발급비용 변조 등 파생 악용
3. 조치 방법
- 거래정보에 대한 전자서명/HMAC 적용 및 서버 검증
- 예비거래와 본거래 거래정보 일치 여부 확인
- 금액 등 핵심 값은 서버 보관 값을 기준으로 처리
🏗️ 현대 금융 IT 환경에서의 변형
API GatewayMSAmTLSKafka
어디가 달라졌나
모놀리식에서는 전문이 한 프로세스 안에서 끝났지만, MSA 에서는 api-gw → txn-orchestrator → ledger-service 처럼
여러 홉을 지납니다. 게이트웨이에서만 HMAC 을 검증하고 내부 구간은 "내부망이니까" 신뢰하는 설계가 가장 흔한 구멍입니다.
내부 서비스 하나가 SSRF 로 뚫리면 그 뒤는 검증 없이 통과합니다.
현대 스택에서의 조치
- 서명은 종단 간(end-to-end)으로. 게이트웨이가 검증한 뒤 다시 서명해서 내부로 넘기거나, 원 서명을 그대로 전달해 최종 처리 서비스가 검증합니다.
- 서비스 간 채널은 mTLS + SPIFFE/SPIRE 로 신원을 증명합니다. 네트워크 위치(내부망)를 신원으로 쓰지 않습니다.
- 이벤트 기반이라면 메시지 자체에 서명합니다. Kafka 토픽에 올라간 이체 이벤트는 컨슈머가 여럿이고, 재처리도 됩니다.
// 게이트웨이 통과 후에도 최종 서비스에서 다시 검증
@PostMapping("/internal/transfer")
public void transfer(@RequestHeader("X-Txn-Signature") String sig,
@RequestHeader("X-Spiffe-Id") String caller,
@RequestBody TxnRequest req) {
if (!allowedCallers.contains(caller)) // 누가 불렀는지
throw new SecurityException("unknown caller");
if (!hmacValid(sig, req.canonical())) // 무엇을 보냈는지
throw new SecurityException("tampered payload");
...
}
놓치기 쉬운 곳 — 서비스 메시(Istio)의 mTLS 는 "누가 불렀는지"만 증명합니다.
전문 내용이 바뀌지 않았음은 증명하지 못합니다. 두 가지는 대체재가 아니라 함께 써야 합니다.