
악성코드 분석가가 되기 위한 큐레이션 가이드로, 필수 지식, 리버스 엔지니어링, 분석 도구, LLM 지원 학습을 실습과 자료와 함께 다룹니다.
이것은 @PINKSAWTOOTH의 개인적인 견해이며, 반드시 당신에게 가장 좋은 방법이 아닐 수도 있습니다. 공부 방법의 한 예시로서 참고해 주시면 감사하겠습니다.
이것을 읽기 전에, 제가 존경하는 멀웨어 분석가 @hasherezade 님이 멀웨어 분석 공부를 어떻게 시작하면 좋을지 블로그에 정리하고 있습니다. 중복되는 부분이 있다고 생각하지만, 일독을 권장합니다. 또한, 아래 블로그는 영어 소스가 중심이므로, 가능한 한 일본어를 중심으로 한 소스를 소개하고 싶습니다.
[!NOTE]
2026년 추가: LLM 시대의 멀웨어 분석 학습
이 페이지를 쓰기 시작했던 당시는 LLM이나 AI Agent가 지금처럼 일상적으로 사용할 수 있는 시대가 아니었습니다. 2026년 현재, 멀웨어 분석이나 리버스 엔지니어링을 공부한다면 서적이나 웹상의 자료에 더해 LLM을 적극적으로 활용하는 것을 권장합니다. 특히 학습용 프로그램 작성, 코드나 어셈블리 설명, 분석, 분석 스크립트 작성, 분석 결과 정리 등에서 매우 유용합니다.
한편으로, 많은 분석 기술에서 LLM이 인간을 능가하는 장면이 늘어나고 있습니다. 그러나 그렇다고 해서 기초 지식이 불필요해진 것은 아닙니다. LLM의 출력을 이해하고, 자신 스스로 그 근거와 정확성을 확인하기 위해서는 전문 지식을 갖추고 있는 것이 중요합니다(그 작업이 의미 없어지는 날도 머지않았을지도 모르지만...). 본고에서는 LLM을 "답을 내는 장치"가 아니라 "함께 학습하는 교사, 분석 시의 조수"로서 활용하는 것을 전제로 하고 있습니다.
먼저, 멀웨어 분석의 전제가 되는 지식에 대해 간단히 설명합니다. 멀웨어 분석에 대해 배우기 전에, 최소한 컴퓨터 사이언스(계산기 과학)의 지식이 필요합니다.
이것들에 대해서는 대학이나 전문학교에서 이수하는 내용을 이해하고 있으면 좋을 것 같습니다. (어딘가의 대학 온라인 실러버스 등을 확인함으로써 더 구체적인 내용을 알 수 있을 것입니다.) 본고에서는 프로그래밍 언어나 컴퓨터 사이언스를 어떻게 배울지는 범위 밖으로 하지만, 다음이 추천 자료입니다.
멀웨어 분석에 필요한 지식을 크게 다음 5가지로 나눕니다.
먼저 멀웨어란 무엇인가, 멀웨어 분석이란 무엇을 하는 작업인가를 배울 필요가 있습니다. 멀웨어 분석 전반에 대해 배우는 데 추천하는 자료, 서적을 소개합니다.
멀웨어 분석 온라인 트레이닝도 추천합니다.
멀웨어의 동작, 악용하는 테크닉에 대해 정리되어 있는 페이지를 소개합니다.
매일 공개되는 위협 정보나 멀웨어 분석을 다룬 블로그나 리포트도 중요한 정보원이 됩니다. RSS 리더 등으로 갱신을 통지해 두면 편리합니다. 그것들을 정리하고 있는 사이트도 있으므로, 활용할 수 있습니다.
이들 중에서 일본어로 멀웨어의 상세한 분석을 다루고 있는 것을 소개해 둡니다.
그 외에도, YARA 룰을 읽음으로써 멀웨어의 특징에 대해 학습할 수 있습니다.
리버스 엔지니어링은 멀웨어 분석에 있어 일부에 지나지 않지만, 멀웨어 분석가가 되기 위해서는 피할 수 없는 길입니다. 샌드박스를 사용한 동적 분석이나 도구를 사용한 동적 분석(수동으로 행하는 디버그를 제외)만으로는 멀웨어 기능의 전모나 사용되고 있는 알고리즘을 특정하는 것은 곤란합니다.
리버스 엔지니어링을 행하기 위해서는 원래의 소스 코드에 대해 이해해 둘 필요가 있습니다. (멀웨어 분석에서 일반적인 Windows 환경을 상정합니다만) Windows API를 사용한 프로그래밍 경험 없이 멀웨어 분석을 하는 것은 멀리 돌아가는 길이 될 것입니다.
Windows API는 Microsoft가 공식 문서와 샘플을 공개하고 있습니다. ※일본어로 번역되어 있으면 일부 표시가 이상한 경우가 있으므로 주의합시다
Windows OS의 구조를 배우는 데는 다음 서적이 추천입니다.
C/C++는 Windows 멀웨어의 리버스 엔지니어링을 배우는 데 있어 지금도 매우 중요하므로, 처음 배우는 언어로서 추천합니다. 한편으로, 실제 분석 대상은 C/C++만이 아닙니다. 2026년 현재는 적어도 다음에 대해, 바이너리나 런타임의 특징을 알아두면 도움이 됩니다.
처음부터 모든 언어를 깊이 배울 필요는 없습니다. 개발 언어나 런타임이 변화하면 필요한 지식도 변화한다는 것은 알아두도록 합시다.
분석 대상의 언어나 환경에서의 프로그래밍 기술이 몸에 익으면, 리버스 엔지니어링에 대해 공부해 갑시다. 멀웨어 분석에서 일반적인 Windows의 PE 파일을 분석하는 경우, 우선은 C나 C++의 입문 프로그램을 리버스 엔지니어링해 봅시다. 다음 단계로서는, 스스로 컴파일한(소스 코드가 존재하는) Win API를 사용한 PE 파일을 분석해 봅시다. 같은 소스 코드라도, 선택하는 프로젝트나 컴파일이나 링크의 옵션 등을 변경하여, 실행 파일에 어떤 변화가 나타나는지까지 보아 두면, 리버스 엔지니어링 기술이 상당히 붙을 것이라고 생각합니다.
예전에는 Microsoft의 샘플이나 GitHub상의 코드를 찾아, 그것을 고쳐 쓰면서 학습하는 것을 추천하고 있었습니다. 이 방법은 현재도 유효하지만, 2026년 현재는 LLM이나 Coding Agent에게 자신의 학습 목적에 맞춘 작은 프로그램을 만들어 받는 방법도 매우 유효합니다.
예를 들어, 처음에는 10~50행 정도의 작은 프로그램을 생성해 받습니다.```text CreateFileWとWriteFileを使ってテキストファイルを作成する、 できるだけ小さなWindows Cプログラムを作ってください。 リバースエンジニアリングの教材に使いたいので、 処理を複雑にせず、各Windows APIを使う理由も説明してください。
生成されたコードを、Microsoft Learnのドキュメントと照らし合わせながら内容を確認し、自分でコンパイルします。
その後、GhidraやIDAなどで自分がコンパイルしたバイナリを解析し、元のソースコードと逆アセンブル・デコンパイル結果を比較します。
以下のループで勉強します。```text
LLMに小さなコードを作らせる
↓
ソースコードを読む・APIを調べる
↓
自分でビルドする
↓
Ghidraなどで解析する
↓
元のソースコードと比較する
↓
分からない部分だけLLMに質問する
↓
別の条件で再ビルドして比較する
예를 들어, 동일한 처리의 소스 코드에 대해 다음을 비교해 보면 좋습니다.
원본 소스 코드를 알고 있는 상태에서 바이너리를 분석하는 것은 리버스 엔지니어링을 배우는 데 매우 좋은 훈련이 됩니다.
더 나아가 리버스 엔지니어링 기술을 연마하려면 CTF의 Rev 문제나 Crackme를 푸는 것이 좋습니다. 특히 PE 파일 문제나 악성코드 분석가를 대상으로 한 것이 추천됩니다.
또한 악성코드 리버스 엔지니어링에서는 암호 알고리즘 처리를 리버스 엔지니어링하는 경우가 많으므로, 기본적인 암호 기술에 대해 배우는 것을 권장합니다. 알고리즘을 이해했다면 GitHub 등에서 공개된 오픈소스 암호 알고리즘 구현 소스 코드를 읽고, 실제로 리버스 엔지니어링해 봅시다.
악성코드 분석을 진행함에 있어 더 좋은 도구를 사용하거나 도구를 능숙하게 다루면 쉽게 분석할 수 있는 경우가 있습니다. 또한 다양한 지식을 가지고 있더라도 실제로는 도구를 통해 분석하기 때문에, 도구의 사용 방법도 이해해 둘 필요가 있습니다.
분석 도구의 설치나 업데이트 등의 관리에는 Windows 환경에서는 Mandiant가 공개한 FLARE-VM이 편리합니다. 악성코드 분석이나 리버스 엔지니어링에 필요한 도구를 한꺼번에 도입할 수 있습니다.
Linux 환경에서는 REMnux를 이용할 수 있습니다. 이 역시 악성코드 분석에 필요한 도구가 정리되어 있으며, 수록 도구 목록에서 확인할 수 있습니다.
FLARE-VM과 REMnux는 둘 다 악성코드 분석 환경을 간단히 구축할 수 있기 때문에, 처음 분석 환경을 만들 때도 추천합니다. 각각에 포함된 도구를 확인하고 실제로 사용해 봄으로써, 어떤 분석 도구가 존재하고 어떤 상황에서 사용하는지를 배울 수 있습니다.
또한 다음 링크에서 소개하는 도구들도 사용해 보면 좋습니다.
LLM의 편리한 사용법 중 하나는 모르는 것을 그 자리에서 질문할 수 있는 교사로 활용하는 것입니다. LLM이 등장하기 이전에는 자신이 이해하지 못한 것을 스스로 조사하고 그 내용을 이해해야 했습니다. 특히 초보자의 경우 애초에 무엇을 조사해야 할지 모르는 경우도 많아, 학습에 있어 하나의 장벽이 되었을 것이라고 생각합니다. 현재는 높은 수준의 지식을 가진 LLM이 자신의 이해도에 맞춰 몇 번이든 친절하게 설명해 줍니다. 모르면 다시 물어보면 되고, "더 쉽게 설명해 줘", "구체적인 예를 들어 줘", "이 이해가 맞는지 확인해 줘"와 같은 사용법도 가능합니다. 의욕만 있다면 모르는 것을 얼마든지 질문하면서 학습할 수 있는, 좋은 시대가 되었다고 생각합니다.
예를 들어, 디스어셈블 결과나 디컴파일 결과에 대해 다음과 같은 질문을 할 수 있습니다.```text この関数の役割と、そう判断できる理由を教えてください。
## 2.3.2.2.2. 認証情報の悪用
### 2.3.2.2.2.1. 概要
**認証情報の悪用**とは、攻撃者が侵害されたシステム内で、盗まれた、あるいは不正に入手した認証情報(ユーザー名、パスワード、APIキー、トークン、ハッシュなど)を利用して、権限を昇格させたり、横方向に移動したり、追加のリソースにアクセスしたりする攻撃手法です。
### 2.3.2.2.2.2. 攻撃の仕組み
1. **認証情報の入手**: 攻撃者はフィッシング、ブルートフォース、メモリダンプ、設定ファイルの読み取りなどにより認証情報を入手します。
2. **認証情報の検証**: 入手した認証情報が有効かどうかを確認します。
3. **権限昇格・横展開**: 有効な認証情報を用いて、より高い権限を持つアカウントや他のシステムへアクセスします。
4. **目的の達成**: データ窃取、マルウェア展開、バックドア設置などを行います。
### 2.3.2.2.2.3. 主な手法
- **Pass-the-Hash (PtH)**: NTLMハッシュを直接使用して認証を行います。
- **Pass-the-Ticket (PtT)**: Kerberosチケットを窃取して再利用します。
- **Overpass-the-Hash**: NTLMハッシュからKerberosチケットを取得します。
- **Golden Ticket**: KRBTGTアカウントのハッシュを用いて任意のKerberosチケットを偽造します。
- **Silver Ticket**: サービスアカウントのハッシュを用いて特定サービスのチケットを偽造します。
- **Credential Dumping**: LSASSメモリやSAMデータベースから認証情報を抽出します。
### 2.3.2.2.2.4. 検出方法
- 異常なログオンタイプ(例: Type 3、Type 9)の監視
- 短時間における多数のアカウントへのログオン試行
- 通常と異なる時間帯・場所からのアクセス
- Kerberosチケットの異常な使用パターン
- LSASSプロセスへの不審なアクセス
### 2.3.2.2.2.5. 対策
- **多要素認証 (MFA)** の導入
- **最小権限の原則**の徹底
- **特権アカウントの分離**と定期的なパスワード変更
- **Credential Guard** や **LSA保護**の有効化
- **監査ログ**の収集とSIEMによる相関分析
- **定期的な脆弱性診断**とパッチ適用```text
このデコンパイル結果から変数の型を推定したいです。
型を判断するために、どの命令、API、参照先を確認すべきですか?
git clone https://github.com/example/security-scanner.git
cd security-scanner
pip install -r requirements.txt
pip install -e .
docker build -t security-scanner .
docker run --rm -v $(pwd):/scan security-scanner /scan
# 현재 디렉터리 스캔
security-scanner scan .
# 특정 디렉터리 스캔
security-scanner scan /path/to/project
# Git 저장소 스캔
security-scanner scan https://github.com/user/repo.git
# 콘솔 출력 (기본값)
security-scanner scan . --format console
# JSON 출력
security-scanner scan . --format json --output results.json
# HTML 보고서
security-scanner scan . --format html --output report.html
# SARIF 출력 (GitHub Code Scanning용)
security-scanner scan . --format sarif --output results.sarif
# 높은 심각도 이상만 표시
security-scanner scan . --severity high
# 심각도 임계값 설정 (CI/CD용)
security-scanner scan . --fail-on high
.security-scanner.yml 파일을 프로젝트 루트에 생성합니다:
rules:
sql-injection:
enabled: true
severity: critical
xss:
enabled: true
severity: high
hardcoded-secrets:
enabled: true
severity: critical
exclude:
- "tests/**"
- "vendor/**"
- "*.min.js"
severity_threshold: medium
사용자 정의 규칙을 YAML로 정의할 수 있습니다:
rules:
custom-api-key:
description: "하드코딩된 API 키 탐지"
pattern: "api[_-]?key\\s*=\\s*['\"][a-zA-Z0-9]{32,}['\"]"
severity: critical
languages:
- python
- javascript
- java
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run security scanner
run: |
pip install security-scanner
security-scanner scan . --format sarif --output results.sarif --fail-on high
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
security-scan:
stage: test
script:
- pip install security-scanner
- security-scanner scan . --format json --output gl-results.json --fail-on high
artifacts:
reports:
sast: gl-results.json
from security_scanner import Scanner, Config
config = Config.from_file(".security-scanner.yml")
scanner = Scanner(config=config)
results = scanner.scan("/path/to/project")
for finding in results.findings:
print(f"[{finding.severity}] {finding.rule_id}: {finding.message}")
print(f" File: {finding.file_path}:{finding.line_number}")
기여를 환영합니다! 자세한 내용은 CONTRIBUTING.md를 참조하세요.
git checkout -b feature/amazing-feature).git commit -m 'Add amazing feature').git push origin feature/amazing-feature).이 프로젝트는 MIT 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.```text このWindows API呼び出しの前後で使われている構造体について説明してください。 各フィールドを確認するためにGhidra上でどこを見るべきかも教えてください。
## 検出機能
- **ファイルレス**: ファイルレス攻撃の検出
- **プロセスインジェクション**: プロセスインジェクション技術の検出
- **難読化スクリプト**: 難読化されたスクリプトの検出
- **メモリ**: メモリ内の不審な活動の検出
- **持続性**: 持続性メカニズムの検出
- **横展開**: 横展開の試みの検出
- **権限昇格**: 権限昇格の試みの検出
- **認証情報アクセス**: 認証情報アクセスの試みの検出
- **偵察**: 偵察活動の検出
- **C2通信**: C2通信の検出
- **データ流出**: データ流出の試みの検出
- **影響**: 影響を与える活動の検出
## 検出ルール
### ファイルレス
- **ファイルレス - PowerShell**: PowerShellファイルレス攻撃の検出
- **ファイルレス - WMI**: WMIファイルレス攻撃の検出
- **ファイルレス - レジストリ**: レジストリファイルレス攻撃の検出
- **ファイルレス - スケジュールタスク**: スケジュールタスクファイルレス攻撃の検出
- **ファイルレス - サービス**: サービスファイルレス攻撃の検出
- **ファイルレス - ドライバ**: ドライバファイルレス攻撃の検出
- **ファイルレス - ブート**: ブートファイルレス攻撃の検出
- **ファイルレス - ログ**: ログファイルレス攻撃の検出
- **ファイルレス - その他**: その他のファイルレス攻撃の検出
### プロセスインジェクション
- **プロセスインジェクション - リモートスレッド**: リモートスレッド作成によるプロセスインジェクションの検出
- **プロセスインジェクション - アトミック**: アトミック操作によるプロセスインジェクションの検出
- **プロセスインジェクション - プロセスホローイング**: プロセスホローイングによるプロセスインジェクションの検出
- **プロセスインジェクション - スレッドハイジャック**: スレッドハイジャックによるプロセスインジェクションの検出
- **プロセスインジェクション - APC**: APCによるプロセスインジェクションの検出
- **プロセスインジェクション - その他**: その他のプロセスインジェクションの検出
### 難読化スクリプト
- **難読化スクリプト - PowerShell**: PowerShell難読化スクリプトの検出
- **難読化スクリプト - VBScript**: VBScript難読化スクリプトの検出
- **難読化スクリプト - JScript**: JScript難読化スクリプトの検出
- **難読化スクリプト - Python**: Python難読化スクリプトの検出
- **難読化スクリプト - その他**: その他の難読化スクリプトの検出
### メモリ
- **メモリ - シェルコード**: シェルコードの検出
- **メモリ - 反射型DLL**: 反射型DLLの検出
- **メモリ - プロセス**: 不審なプロセスの検出
- **メモリ - ドライバ**: 不審なドライバの検出
- **メモリ - その他**: その他の不審なメモリ活動の検出
### 持続性
- **持続性 - レジストリ**: レジストリ持続性の検出
- **持続性 - スケジュールタスク**: スケジュールタスク持続性の検出
- **持続性 - サービス**: サービス持続性の検出
- **持続性 - スタートアップ**: スタートアップ持続性の検出
- **持続性 - WMI**: WMI持続性の検出
- **持続性 - その他**: その他の持続性メカニズムの検出
### 横展開
- **横展開 - SMB**: SMB横展開の検出
- **横展開 - WMI**: WMI横展開の検出
- **横展開 - PowerShell**: PowerShell横展開の検出
- **横展開 - RDP**: RDP横展開の検出
- **横展開 - SSH**: SSH横展開の検出
- **横展開 - その他**: その他の横展開の検出
### 権限昇格
- **権限昇格 - UAC**: UACバイパスの検出
- **権限昇格 - トークン**: トークン操作の検出
- **権限昇格 - サービス**: サービス権限昇格の検出
- **権限昇格 - ドライバ**: ドライバ権限昇格の検出
- **権限昇格 - その他**: その他の権限昇格の検出
### 認証情報アクセス
- **認証情報アクセス - LSASS**: LSASSアクセスの検出
- **認証情報アクセス - SAM**: SAMアクセスの検出
- **認証情報アクセス - レジストリ**: レジストリ認証情報アクセスの検出
- **認証情報アクセス - ブラウザ**: ブラウザ認証情報アクセスの検出
- **認証情報アクセス - その他**: その他の認証情報アクセスの検出
### 偵察
- **偵察 - システム**: システム偵察の検出
- **偵察 - ネットワーク**: ネットワーク偵察の検出
- **偵察 - ユーザー**: ユーザー偵察の検出
- **偵察 - プロセス**: プロセス偵察の検出
- **偵察 - その他**: その他の偵察活動の検出
### C2通信
- **C2通信 - HTTP**: HTTP C2通信の検出
- **C2通信 - HTTPS**: HTTPS C2通信の検出
- **C2通信 - DNS**: DNS C2通信の検出
- **C2通信 - TCP**: TCP C2通信の検出
- **C2通信 - UDP**: UDP C2通信の検出
- **C2通信 - その他**: その他のC2通信の検出
### データ流出
- **データ流出 - HTTP**: HTTPデータ流出の検出
- **データ流出 - HTTPS**: HTTPSデータ流出の検出
- **データ流出 - DNS**: DNSデータ流出の検出
- **データ流出 - FTP**: FTPデータ流出の検出
- **データ流出 - その他**: その他のデータ流出の検出
### 影響
- **影響 - ランサムウェア**: ランサムウェア活動の検出
- **影響 - データ破壊**: データ破壊活動の検出
- **影響 - サービス停止**: サービス停止活動の検出
- **影響 - その他**: その他の影響活動の検出```text
このアセンブリを1命令ずつ説明するのではなく、
まずbasic blockごとの役割を整理して、私が自分で処理を推定できるようにヒントをください。
pip install secscan
git clone https://github.com/example/secscan.git
cd secscan
pip install -e .
docker pull secscan/secscan:latest
docker run --rm -v $(pwd):/scan secscan/secscan:latest /scan
# 현재 디렉터리 스캔
secscan scan .
# 특정 디렉터리 스캔
secscan scan /path/to/project
# 단일 파일 스캔
secscan scan app.py
secscan scan --git https://github.com/example/repo.git
# JSON 출력
secscan scan . --format json --output results.json
# HTML 보고서
secscan scan . --format html --output report.html
# SARIF 출력 (CI/CD용)
secscan scan . --format sarif --output results.sarif
Usage: secscan [OPTIONS] COMMAND [ARGS]...
Options:
--version 버전 표시
--help 도움말 표시
Commands:
scan 소스 코드에서 보안 문제 스캔
rules 사용 가능한 규칙 나열
config 설정 관리
Usage: secscan scan [OPTIONS] TARGET
Options:
-f, --format [console|json|html|sarif] 출력 형식 (기본값: console)
-o, --output PATH 출력 파일 경로
-s, --severity [critical|high|medium|low|info] 최소 심각도 필터
-l, --language TEXT 특정 언어로 제한
-e, --exclude TEXT 제외할 패턴
--git 대상이 Git 저장소임
--config PATH 설정 파일 경로
--rules PATH 사용자 정의 규칙 디렉터리
--no-color 색상 출력 비활성화
-v, --verbose 상세 출력
--help 도움말 표시
# 높은 심각도 문제만 표시
secscan scan . --severity high
# Python 파일만 스캔
secscan scan . --language python
# 테스트 디렉터리 제외
secscan scan . --exclude "tests/*" --exclude "*.min.js"
# 사용자 정의 규칙 사용
secscan scan . --rules ./my-rules/
# 상세 출력과 함께 JSON 보고서 생성
secscan scan . --format json --output report.json --verbose
SecScan은 다음 위치에서 설정 파일을 찾습니다:
--config 옵션으로 지정된 경로.secscan.yml~/.config/secscan/config.yml# .secscan.yml
severity: medium
format: console
exclude:
- "tests/*"
- "*.min.js"
- "node_modules/*"
- "vendor/*"
languages:
- python
- javascript
- go
rules:
custom_rules_dir: ./custom-rules
disabled:
- "SQL_INJECTION_001"
- "XSS_002"
SecScan은 다음과 같은 카테고리의 50개 이상의 내장 규칙을 포함합니다:
YAML 형식으로 사용자 정의 규칙을 정의할 수 있습니다:
# custom-rules/my-rule.yml
id: CUSTOM_001
name: 하드코딩된 API 키
description: 소스 코드에 하드코딩된 API 키를 감지합니다
severity: high
languages:
- python
- javascript
pattern: '(?i)(api[_-]?key|apikey)\s*=\s*["\'][a-zA-Z0-9]{16,}["\']'
message: "하드코딩된 API 키가 발견되었습니다. 환경 변수를 사용하세요."
references:
- https://owasp.org/www-community/vulnerabilities/Use_of_hard-coded_password
name: Security Scan
on: [push, pull_request]
jobs:
secscan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: SecScan 실행
uses: secscan/action@v1
with:
args: scan . --format sarif --output results.sarif
- name: SARIF 업로드
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
secscan:
image: secscan/secscan:latest
script:
- secscan scan . --format json --output results.json
artifacts:
reports:
sast: results.json
pipeline {
agent any
stages {
stage('Security Scan') {
steps {
sh 'secscan scan . --format json --output results.json'
}
}
}
post {
always {
archiveArtifacts artifacts: 'results.json'
}
}
}
$ secscan scan .
SecScan v1.0.0 - 보안 스캐너
스캔 대상: /path/to/project
스캔 시간: 2.34초
[CRITICAL] SQL Injection
파일: app/database.py:45
코드: cursor.execute("SELECT * FROM users WHERE id = " + user_id)
설명: 사용자 입력이 SQL 쿼리에 직접 연결되었습니다
수정: 매개변수화된 쿼리를 사용하세요
[HIGH] 하드코딩된 자격 증명
파일: config/settings.py:12
코드: PASSWORD = "secret123"
설명: 소스 코드에 비밀번호가 하드코딩되어 있습니다
수정: 환경 변수나 비밀 관리 도구를 사용하세요
발견된 문제: 2개 (Critical: 1, High: 1)
{
"version": "1.0.0",
"scan_time": "2024-01-15T10:30:00Z",
"target": "/path/to/project",
"duration": 2.34,
"findings": [
{
"id": "SQL_INJECTION_001",
"severity": "critical",
"title": "SQL Injection",
"file": "app/database.py",
"line": 45,
"code": "cursor.execute(\"SELECT * FROM users WHERE id = \" + user_id)",
"message": "사용자 입력이 SQL 쿼리에 직접 연결되었습니다",
"remediation": "매개변수화된 쿼리를 사용하세요"
}
],
"summary": {
"total": 2,
"critical": 1,
"high": 1,
"medium": 0,
"low": 0,
"info": 0
}
}
from secscan import Scanner, Config
# 설정 초기화
config = Config(
severity="high",
languages=["python", "javascript"],
exclude=["tests/*"]
)
# 스캐너 생성
scanner = Scanner(config)
# 디렉터리 스캔
results = scanner.scan_directory("/path/to/project")
# 결과 처리
for finding in results.findings:
print(f"[{finding.severity.upper()}] {finding.title}")
print(f" {finding.file}:{finding.line}")
print(f" {finding.message}")
from secscan.formatters import BaseFormatter
class CustomFormatter(BaseFormatter):
def format(self, results):
output = []
for finding in results.findings:
output.append(f"{finding.severity}: {finding.title} ({finding.file}:{finding.line})")
return "\n".join(output)
# 사용자 정의 포맷터 등록
scanner.register_formatter("custom", CustomFormatter())
스캔이 너무 오래 걸림
--exclude를 사용하여 불필요한 디렉터리를 제외하세요--language로 특정 언어만 스캔하세요거짓 양성
규칙을 찾을 수 없음
--rules 옵션으로 올바른 경로를 지정했는지 확인하세요secscan rules 명령어로 사용 가능한 규칙을 확인하세요# 상세 로깅 활성화
secscan scan . --verbose
# 디버그 출력
SECSCAN_DEBUG=1 secscan scan .
기여를 환영합니다! 자세한 내용은 CONTRIBUTING.md를 참조하세요.
# 저장소 복제
git clone https://github.com/example/secscan.git
cd secscan
# 가상 환경 생성
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 개발 종속성 설치
pip install -e ".[dev]"
# 테스트 실행
pytest
# 린트 실행
ruff check .
mypy secscan
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
最初から答えを聞くのではなく、ヒント、確認ポイント、検証方法を聞く使い方がおすすめです。
### Agentic Reverse Engineering
2026年現在は、ChatGPTのような対話型LLMだけでなく、ファイルの読み書き、プログラムのビルド、コマンドの実行などを行えるCoding Agentも利用できるようになっています。
さらに、MCP(Model Context Protocol)などを利用することで、AI Agentから解析ツールを直接操作する方法も広まりつつあります。
例えばREMnuxには、AI AgentからREMnux上のマルウェア解析ツールを利用するためのMCP Serverが用意されています。
- [Using AI with REMnux](https://docs.remnux.org/tips/using-ai)
- [REMnux MCP Server](https://github.com/REMnux/remnux-mcp-server)
Ghidraについても、AI Agentから操作するためのMCP実装がいくつか登場しています。私もGhidraをHeadlessで利用し、MCP経由でAI Agentから解析を行うためのMecha Ghidraを開発しています。
- [Mecha Ghidra](https://github.com/ghidra-user-jp/mecha_ghidra)
IDAやその他のリバースエンジニアリングツールについても、MCPやAgentと連携するための実装が複数登場しており、これまで人間が手作業で行っていた解析作業をAgentに任せることができるようになっています。
一方で、初学者の段階からすべての解析をAgentに任せてしまうのはおすすめしません。「なぜその解析を行ったのか」「ツールが内部で何をしているのか」「出力された結果が正しいのか」といったことを自分で判断する力が身につきにくくなるためです。
まずは自分で解析し、分からない部分をLLMに質問するところから始めるとよいでしょう。慣れてきたら、解析支援スクリプトの作成、MCPによるツール連携、Agentを使った解析の自動化へと徐々に進んでいくことをおすすめします。
### LLMへ情報を入力するときの注意
業務で扱っているマルウェア、顧客から提供されたファイル、未公開のIoC、インシデント情報、社内情報などを外部のLLMサービスへ入力する場合には注意が必要です。
利用しているサービスの契約内容、データの保持期間、学習への利用有無、所属組織のルールなどを確認したうえで利用しましょう。
必要に応じて、以下のような対策を検討してください。
- 機微情報をマスクする
- 組織で許可されたLLMサービスを利用する
- APIやEnterprise向けサービスのデータ取り扱いを確認する
- 必要に応じてローカルLLMを利用する
また、マルウェア本体や解析対象のファイル、解析結果の中には、AI Agentを意図しない動作へ誘導する文字列が含まれている可能性もあります。
特に、AI Agentがファイル操作やコマンド実行、解析ツールの操作まで行える場合は、通常のLLMよりも強い権限を持つことになります。そのため、マルウェア解析でAI Agentを利用する場合は、VMなどの隔離環境上で実行し、安全性を確保することをおすすめします。
AIはかなり賢くなりましたが、それでも意図しないコマンドを実行することがあります。
これまでのマルウェア解析と同様に解析環境を隔離するという基本を守って利用しましょう。
# 実際のマルウェアを使わない学習
2026年現在、マルウェア解析を勉強するために、最初から実際のマルウェアを入手する必要はありません。
むしろ初学者には、以下の順番をおすすめします。
1. LLMや自分で作成した10〜50行程度の小さなプログラム
2. 自分でコンパイルしたWindows APIのサンプル
3. CTF/Crackme/マルウェア解析トレーニング用サンプル
4. マルウェアやC2フレームワークなど、ソースコードが公開されているOSS実装
5. 必要性があり、安全な解析環境を準備できる場合のみ実際のマルウェア
最初のうちは、元のソースコードが分かっているプログラムを教材にするのがおすすめです。
自分で解析した結果と実際のソースコードを比較できるため、「どこまで正しく解析できたか」「どこを読み違えたか」を自分で確認できます。
いきなり実際のマルウェアを解析するよりも、まずは答え合わせのできる教材を使って、逆アセンブルやデコンパイル結果の読み方に慣れる方が効率よく学習できると思います。
# マルウェアの入手
## 前置き
ここではマルウェアの入手方法について触れますが、紹介するサービスを利用する際は利用規約を必ず読んで利用してください。
また、以下の内容は、マルウェアの入手を勧めるものではありません。
不正指令電磁的記録に関する罪では、マルウェアの作成、提供、取得、保管などについて、その目的や正当な理由の有無などが要件になります。
私は法律の専門家ではないため、どういった理由であれば法律上の`正当な理由`にあたるかはわかりません。
個人の趣味でマルウェア解析をおこなうことは`正当な理由`として認められない可能性もあります。
捜査されると困る、裁判になったら困る、正当な理由として提示できる活動実績がない、弁護費用がないなど、平穏な人生を絶対に送りたいという人は、個人の趣味でやらないほうがよいかと思います。
とはいえ過度に怯えすぎて萎縮する必要はないとは思います。
最低限、警視庁が公開している不正指令電磁的記録に関する罪に関するページには目を通して、内容を確認しておきましょう。
- https://www.keishicho.metro.tokyo.jp/kurashi/cyber/law/virus.html
マルウェアを扱う上で気にしなければいけないことは、法律面だけではありません。
マルウェアを実行(故意かどうかは問わない)すると、たいていの場合は攻撃者の用意したサーバにアクセスします。
攻撃者のサーバには自分の利用しているIPアドレスのログが残りますし、接続時に利用しているシステムの情報を送信することもあります。
マルウェアによっては、攻撃者によるコマンドの実行などがおこなわれることも考えられますし、内部ネットワークのスキャンや(一番避けるべき)外部への感染活動などがおこなわれるかもしれません。
攻撃者のサーバに記録された情報は攻撃者自身だけでなく、第三者へ提供されることもあります。また、捜査機関はサーバを差し押さえてログを解析したうえで、ISPに情報開示請求をおこなうことができます。
以下のどれか一つにでも当てはまる場合は、実際のマルウェアを利用した学習は控えましょう。
- マルウェアを取り扱う上で、不安がある。
- マルウェア解析のための専用PCや独立したネットワークなど隔離した環境を用意できない。
- 未成年もしくは学生であるが、マルウェアを扱った解析や研究をするうえで責任者がいない(社会人の場合は、全て自己責任として責任を取れない)。
実際のマルウェアを個人的に入手しなくても、学習する方法は前述しております。
最後にオタクがみんな大好きな以下の名言たちで前置きを終えます。
- `With great power comes great responsibility`
- `The abyss gazes also into you.`
## マルウェア共有サービス/IoC共有サービス
マルウェアのサンプルやIoCを共有するためのサービスがいくつかあります。もっとも登録が多く有名なサービスはVirusTotalですが、有償アカウントのみダウンロードが可能であるため、ここでは無償で利用可能なサービスを紹介します。
この2つのサービスがサンプルの入手先としては有力です。
- [MalwareBazaar](https://bazaar.abuse.ch/)
- [Vx Underground](https://www.vx-underground.org/)
参考情報として以下のサービスも記載しておきます。
- [URLhaus](https://urlhaus.abuse.ch/)
- [ThreatFox](https://threatfox.abuse.ch/)
- [MalShare](https://www.malshare.com/)
- [VirusShare](https://virusshare.com/)
- [VirusBay](https://beta.virusbay.io/)
- [Vx Vaul](http://vxvault.net//ViriList.php)
- [theZoo](https://thezoo.morirt.com/)
- [malpedia](https://malpedia.caad.fkie.fraunhofer.de/)
## オンラインサンドボックス
無料で使用できるオンラインサンドボックスのサービスは本来マルウェアの挙動を解析するサービスですが、他者の投稿したマルウェアをダウンロードすることができます。
- [Hybrid Analysis](https://www.hybrid-analysis.com/)
- [Any Run](https://app.any.run/)
- [Triage](https://tria.ge/)
- [Joe Sandbox](https://www.joesandbox.com/)
- [cape](https://capesandbox.com/)
## OSS RAT
以下はRAT(Remote Access Trojan)の実装を理解するのに役に立つリポジトリです。
ソースコードと実際のバイナリを比較することで、通信処理、コマンド実行、ファイル操作などの実装を学ぶことができます。
- [Lilith RAT](https://github.com/werkamsus/Lilith)
- [Quasar RAT](https://github.com/quasar/Quasar)
- [NGLite](https://github.com/Maka8ka/NGLite)
- [AsyncRAT](https://github.com/NYAN-x-CAT/AsyncRAT-C-Sharp)
- [trochilus RAT](https://github.com/5loyd/trochilus)
- [gh0st RAT](https://github.com/sin5678/gh0st)
- [Poison-Ivy-Reload](https://github.com/killeven/Poison-Ivy-Reload)
- [GitHub Topics rat](https://github.com/topics/rat)
## C2フレームワーク
マルウェアのC2通信やAgentの実装を理解するためには、オープンソースで公開されているC2フレームワークのソースコードを読むことも参考になります。
C2フレームワークには、AgentとC2 Server間の通信、コマンドの受信と実行、ファイル操作、プロセス操作、通信データの暗号化など、マルウェアでもよく見られる機能が実装されています。
それぞれ実装言語やAgentの構造、通信方式が異なるため、ソースコードと生成されたAgentを比較しながらリバースエンジニアリングしてみるのもよいでしょう。
- [Sliver](https://github.com/BishopFox/sliver)
- [Mythic](https://github.com/its-a-feature/Mythic)
- [Mythic Agents](https://github.com/MythicAgents)
- [AdaptixC2](https://github.com/Adaptix-Framework/AdaptixC2)
- [Empire](https://github.com/BC-SECURITY/Empire)
- [PoshC2](https://github.com/nettitude/PoshC2)
- [Merlin](https://github.com/Ne0nd0g/merlin)
- [MITRE CALDERA](https://github.com/mitre/caldera)
- [Havoc](https://github.com/HavocFramework/Havoc)
- [The C2 Matrix](https://www.sans.org/tools/the-c2-matrix)
- 様々なC2フレームワークの機能や特徴を比較するための一覧
| 규칙 ID | 설명 | 심각도 |
|---|
sql-injection | SQL 인젝션 취약점 탐지 | Critical |
xss | 크로스 사이트 스크립팅 탐지 | High |
command-injection | OS 명령어 인젝션 탐지 | Critical |
path-traversal | 경로 탐색 취약점 탐지 | High |
hardcoded-secrets | 하드코딩된 자격 증명 탐지 | Critical |
weak-crypto | 안전하지 않은 암호화 알고리즘 탐지 | Medium |
insecure-random | 안전하지 않은 난수 생성 탐지 | Medium |
| 카테고리 | 규칙 수 | 설명 |
|---|
| SQL Injection | 8 | SQL 쿼리 취약점 |
| XSS | 6 | 크로스 사이트 스크립팅 |
| Command Injection | 5 | OS 명령어 주입 |
| Path Traversal | 4 | 디렉터리 순회 |
| 하드코딩된 자격 증명 | 7 | 하드코딩된 비밀번호, API 키 |
| 안전하지 않은 암호화 | 6 | 약한 암호화 알고리즘 |
| 취약한 종속성 | 5 | 알려진 취약한 라이브러리 |
| 안전하지 않은 역직렬화 | 4 | 역직렬화 취약점 |
| SSRF | 3 | 서버 측 요청 위조 |
| 기타 | 10+ | 기타 보안 문제 |