AI 코드보안 지킴이 데모

코드의 보안 문제를 찾고, AI와 사람이 함께 검토하고, 조직의 정책에 따라 판단하고, 조치한 뒤 다시 확인하는 과정을 하나로 잇는 솔루션입니다.

개발 중 샘플 데이터로 만든 결과 화면입니다. 실제 고객 데이터는 없으며, 출시 제품의 화면과 다를 수 있습니다.

  1. 대시보드
  2. 프로젝트 결과
  3. 항목 상세
  4. AI 검토 확인

프로젝트별 보안 취약점

마지막으로 끝까지 완료한 검사 기준입니다. 같은 문제는 한 번만 셉니다.

프로젝트비밀값시큐어코딩오픈소스 취약점라이선스합계마지막 검사AI 오탐 추정
payment-api1741132026-10-10 09:052건
partner-portal052072026-10-09 18:421건
batch-settlement2361122026-10-08 11:200건

데모에서는 payment-api 프로젝트의 결과를 열어 볼 수 있습니다.

대시보드 / payment-api

payment-api

미해결 13건 · 같은 규칙에 걸린 항목은 한 그룹으로 묶어 보여 줍니다.

SQL 쿼리 문자열 결합CWE-89HIGH2건
로그에 민감정보 출력CWE-532MEDIUM3건
  • src/main/java/com/sample/payment/PaymentService.java:112
  • src/main/java/com/sample/payment/log/LogMasking.java:21 AI 오탐 추정
  • src/main/java/com/sample/payment/card/CardController.java:88
경로 조작CWE-22HIGH1건
  • src/main/java/com/sample/payment/file/FileController.java:57 AI 오탐 추정
예측 가능한 난수 사용CWE-330MEDIUM1건
  • src/main/java/com/sample/payment/auth/TokenGenerator.java:19
log4j-core 원격 코드 실행CVE-2021-44228CRITICAL1건
  • org.apache.logging.log4j:log4j-core 2.14.1 · 수정 버전 2.17.1 이상
spring-beans 원격 코드 실행CVE-2022-22965CRITICAL1건
  • org.springframework:spring-beans 5.3.17 · 수정 버전 5.3.18 이상
commons-text 문자열 치환 원격 코드 실행CVE-2022-42889CRITICAL1건
  • org.apache.commons:commons-text 1.9 · 수정 버전 1.10.0 이상
jackson-databind 깊은 중첩 서비스 거부CVE-2020-36518HIGH1건
  • com.fasterxml.jackson.core:jackson-databind 2.13.1 · 수정 버전 2.13.2.1 이상
클라우드 액세스 키 노출CRITICAL1건
  • src/main/resources/application-prod.yml:12 · 값은 가려서 표시합니다 AKIA••••••••
강한 카피레프트 라이선스 구성요소AGPL-3.0HIGH1건
  • com.itextpdf:kernel 7.2.5 · 서비스 제공 방식에 따라 소스 공개 의무가 생길 수 있어 법무 검토가 필요합니다.

데모에서는 OrderRepository.java:48 항목의 상세 화면을 볼 수 있습니다.

대시보드 / payment-api / 항목 상세

SQL 쿼리 문자열 결합

src/main/java/com/sample/payment/order/OrderRepository.java:48

위치

46public List<Order> findByCustomer(String customerId) {
47    // 고객별 주문 조회
48    String sql = "SELECT * FROM orders WHERE customer_id = '" + customerId + "'";49    return jdbcTemplate.query(sql, orderMapper);
50}

왜 위험한지

외부에서 받은 값을 SQL 문장에 그대로 이어 붙이면, 공격자가 값에 SQL 구문을 넣어 다른 고객의 주문을 조회하거나 데이터를 바꿀 수 있습니다.

고치는 방법

값을 문자열로 이어 붙이지 말고 바인딩 변수(?)로 전달하세요. 쿼리 문장과 값이 분리되어 입력값이 SQL 구문으로 해석되지 않습니다.

요약

심각도
HIGH
범주
시큐어코딩
분류
CWE-89 SQL 삽입
상태
신규
처음 발견
2026-10-10
AI 검토정탐

customerId가 요청 값에서 검증 없이 SQL 문장으로 들어갑니다. 실제로 악용될 수 있는 위치로 판단했습니다.

제안 수정

- String sql = "SELECT * FROM orders WHERE customer_id = '" + customerId + "'";
- return jdbcTemplate.query(sql, orderMapper);
+ String sql = "SELECT * FROM orders WHERE customer_id = ?";
+ return jdbcTemplate.query(sql, orderMapper, customerId);

AI 판정은 제안입니다. 최종 결정은 담당자가 합니다.

AI 오탐 추정

AI가 오탐으로 추정한 항목입니다. 담당자가 근거를 보고 확인하면 집계에서 빠집니다.

선택프로젝트항목AI 판단 근거
payment-api로그에 민감정보 출력
LogMasking.java:21
출력 전에 카드번호를 앞 6자리와 뒤 4자리만 남기고 가립니다.
payment-api경로 조작
FileController.java:57
파일 이름을 허용 목록과 대조한 뒤에만 경로에 씁니다.
partner-portal검증 없는 HTML 삽입
NoticeView.tsx:34
삽입하기 전에 허용된 태그만 남기도록 정제합니다.