TL;DR

  • 오픈소스 정적 애플리케이션 보안 테스트(SAST) 도구 Rowan은 코드와 모델 파일을 실행하지 않고 분석해 AI 앱을 포함한 프로젝트의 잠재적 취약점과 검토 가능한 근거를 보고함.
  • 탐지 항목은 인젝션, 안전하지 않은 역직렬화, 서버 측 요청 위조(SSRF), 비밀정보 노출, 위험한 에이전트 도구, 안전하지 않은 모델 로딩 등임.
  • Python 3.10+, pipx 또는 uv로 설치하고, 스캔 엔진인 Opengrep을 설치한 뒤 자체 테스트를 거쳐 프로젝트를 검사함.
  • Python 및 JavaScript/TypeScript 분석이 가장 깊으며, 규칙 카탈로그는 YAML 파일 48개, 규칙 590개로 구성됨.
  • 스캔은 대규모 언어 모델(LLM)을 호출하거나 코드를 업로드하지 않지만, 의존성 조회는 네트워크를 사용하며 결과는 확인되지 않은 단서로 취급해야 함.

Rowan 소개

  • Rowan은 코드와 AI/머신러닝(ML) 프로젝트의 보안 문제를 탐지하고, 검토 가능한 근거와 함께 가능성 높은 취약점을 보고하는 오픈소스 도구임.
  • 소스 코드와 모델 파일을 읽으며, 코드를 실행하지 않음.
  • 인젝션, 안전하지 않은 역직렬화, 서버 측 요청 위조(SSRF), 비밀정보 유출, 위험한 에이전트 도구, 안전하지 않은 모델 로딩 등을 탐지함.
  • 알파 버전이므로 모든 발견 항목은 확인된 버그가 아닌 검토할 단서로 취급해야 함. 깨끗한 보고서도 프로젝트의 보안을 입증하지 않음.

빠른 시작

  • Python 3.10 이상과 pipx가 필요함. pipx는 명령줄 도구를 별도 환경에 설치함.
  • macOS에서는 brew install pipx를 실행하고, 이어서 pipx ensurepath를 실행한 뒤 새 터미널을 열어야 함.
  • Rowan 설치 명령은 pipx install "rowan-sast[js-crossfile]"임. uv를 사용한다면 uv tool install "rowan-sast[js-crossfile]"도 가능함.
  • Homebrew Python에서는 일반 pip install이 의도적으로 실패함. 가상 환경을 이용한 설치 방법은 시작 안내에서 확인할 수 있음.
  • 스캔 엔진인 Opengrep을 설치하고 경로를 설정한 다음 자체 테스트를 실행함.
  • rowan install-engine 실행
  • export PATH="$HOME/.local/bin:$PATH" 실행
  • rowan self-test 실행. [OK]가 세 번 출력되어야 함.
  • 프로젝트 스캔은 rowan scan /path/to/your-project로 실행함.
  • Windows, 문제 해결 및 자세한 내용은 시작 안내에 있음.

코딩 에이전트로 실행하기

  • 프로젝트를 연 상태에서 Claude Code, Codex, Cursor 또는 터미널 명령을 실행할 수 있는 에이전트에 다음 절차를 입력할 수 있음.
  • 시작 안내를 따라 Rowan을 프로젝트 내부가 아닌 별도 폴더에 설치함.
  • rowan self-test를 실행하고 엔진이 [OK]가 아니면 중단한 뒤 사용자에게 알림.
  • rowan scan <프로젝트의 절대 경로> --no-project-config --no-sca --audit -f json -o <프로젝트 외부 폴더>/rowan-report.json을 실행함.
  • summary.degraded가 true라면 스캔이 불완전하다는 점과 그 이유를 알림.
  • 심각도 High 및 Critical 발견 항목을 파일:줄 링크와 함께 나열하고, 코드를 확인했는지 아니면 아직 단서인지 각각 밝힘.
  • 프로젝트의 코드는 변경하지 않음.
  • --no-sca를 사용하면 첫 스캔을 오프라인으로 유지함. 이 옵션을 빼면 알려진 CVE를 확인하기 위해 패키지 이름과 버전을 OSV에 전송함.

자주 쓰는 명령

  • rowan scan PATH: 읽기 쉬운 보고서를 출력함.
  • rowan scan PATH --audit: 낮은 심각도의 발견 항목도 포함함.
  • rowan scan PATH -f json -o report.json: JSON 보고서를 저장하며, HTML 및 SARIF 형식도 지원함.
  • rowan scan PATH --ci --severity high: CI에서 High 또는 Critical 발견 항목이 있으면 종료 코드 1을 반환함.
  • rowan scan PATH --write-baseline base.json: 현재 발견 항목을 기준선 파일에 기록함.
  • rowan scan PATH --ci --baseline base.json: 기준선 이후 새로 발견된 항목만 보고함.
  • --ci 사용 시 종료 코드 0은 발견 항목 없음, 1은 발견 항목 있음, 2는 스캔 불완전 상태를 뜻함.
  • 보고서에는 소스 코드와 비밀정보가 포함될 수 있으므로 공유 전에 검토해야 함.

검사 항목

  • 소스 코드: 인젝션, 안전하지 않은 역직렬화, 경로 순회, SSRF, 크로스 사이트 스크립팅(XSS), 비밀정보.
  • AI/ML 앱: 모델 로딩, 에이전트 도구, LLM 출력 처리, 프롬프트 파일, MCP 구성.
  • 데이터 흐름: Opengrep을 이용한 파일 내부 분석, Python 및 JS/TS의 파일 간 분석, Go의 제한적 분석.
  • 의존성: 알려진 CVE, 도달 가능성 힌트, CycloneDX 소프트웨어 자재 명세서(SBOM), OpenVEX 출력.
  • 모델 파일: Hayward를 통한 Pickle, PyTorch, GGUF, SafeTensors, Keras, ONNX, TensorFlow, numpy, joblib.
  • Python과 JS/TS가 가장 깊은 분석을 제공함. Java, Kotlin, C#은 파일 내부 데이터 흐름을 분석하고 Ruby, PHP, Rust는 제한적인 패턴 검사만 수행함.
  • 보고서에는 분석할 수 없었던 항목이 표시됨.
  • 규칙 카탈로그는 YAML 파일 48개에 걸친 규칙 590개로 구성되며, 정규식 규칙 400개와 Opengrep 기반 오염 분석 규칙 190개를 포함함. 자세한 내용은 규칙 카탈로그에서 확인할 수 있음.

개인정보 보호

  • rowan scan은 LLM을 호출하지 않으며 코드를 업로드하지 않음.
  • 네트워크 호출은 의존성 조회인 OSV 및 FIRST EPSS에 한정되며, --no-sca로 이를 끌 수 있음.
  • 실험적 명령인 rowan hunt는 사용자가 설정한 LLM으로 코드를 전송함. 자세한 내용은 사용 안내서에 있음.

추가 정보

  • 시작 안내: 설치, 첫 스캔, MCP 설정, 문제 해결.
  • 기능: Rowan이 탐지하는 항목, 비교 내용, 측정 결과.
  • 사용 안내서: 모든 옵션, 구성, 기준선, CI, GitHub Action.
  • 기여 및 아키텍처.
  • 보안 정책: Rowan의 취약점을 비공개로 신고하는 방법.

라이선스

  • 라이선스는 MIT임. Opengrep은 별도의 LGPL-2.1 엔진이며 Rowan에 포함되지 않음.