
Guide organisé pour devenir analyste en malware, couvrant les connaissances essentielles, l'ingénierie inverse, les outils d'analyse et l'apprentissage assisté par LLM avec des exercices pratiques et des ressources.
Ceci est l'opinion personnelle de @PINKSAWTOOTH et ce n'est peut-être pas forcément la meilleure méthode pour vous. J'espère que vous pourrez vous en servir comme exemple de méthode d'apprentissage.
Avant de lire ceci, l'analyste de malware que je respecte, @hasherezade, a résumé dans un blog comment commencer l'apprentissage de l'analyse de malware. Il y aura probablement des parties redondantes, mais je vous recommande d'y jeter un coup d'œil. De plus, comme les blogs ci-dessous sont principalement des sources en anglais, je souhaite présenter autant que possible des sources centrées sur le japonais.
[!NOTE]
Ajout 2026 : Apprentissage de l'analyse de malware à l'ère des LLM
À l'époque où j'ai commencé à écrire cette page, les LLM et les AI Agent n'étaient pas utilisables quotidiennement comme aujourd'hui. En 2026, si vous étudiez l'analyse de malware ou le reverse engineering, je vous recommande d'utiliser activement les LLM en plus des livres et des ressources en ligne. Ils sont particulièrement utiles pour la création de programmes d'apprentissage, l'explication de code et d'assembleur, l'analyse, la création de scripts d'analyse, l'organisation des résultats d'analyse, etc.
D'un autre côté, les situations où les LLM surpassent les humains dans de nombreuses techniques d'analyse se multiplient. Cependant, cela ne signifie pas pour autant que les connaissances fondamentales soient devenues inutiles. Pour comprendre les sorties des LLM et vérifier soi-même leurs fondements et leur exactitude, il est important de posséder des connaissances spécialisées (même si le jour où ce travail perdra son sens est peut-être proche...). Dans cet article, nous partons du principe d'utiliser les LLM non pas comme un « dispositif qui donne des réponses », mais comme un « enseignant avec qui apprendre, un assistant lors de l'analyse ».
Tout d'abord, j'explique brièvement les connaissances préalables à l'analyse de malware. Avant d'apprendre l'analyse de malware, des connaissances minimales en informatique (science informatique) sont nécessaires.
Pour ces éléments, il suffit de comprendre le contenu enseigné dans les universités ou les écoles spécialisées. (En consultant les syllabus en ligne de certaines universités, vous pourrez découvrir des contenus plus concrets.) Dans cet article, la manière d'apprendre les langages de programmation et l'informatique sort du cadre, mais voici les ressources recommandées.
Je divise les connaissances nécessaires à l'analyse de malware en cinq grandes catégories.
Tout d'abord, il est nécessaire d'apprendre ce qu'est un malware et en quoi consiste le travail d'analyse de malware. Je présente les ressources et livres recommandés pour apprendre l'analyse de malware en général.
Les formations en ligne d'analyse de malware sont également recommandées.
Je présente des pages qui résument le comportement des malwares et les techniques d'exploitation.
Les blogs et rapports traitant des informations sur les menaces et de l'analyse de malware publiés quotidiennement constituent également d'importantes sources d'information. Il est pratique de configurer des notifications de mise à jour via un lecteur RSS, etc. Il existe aussi des sites qui les regroupent, que vous pouvez utiliser.
Parmi ceux-ci, je présente ceux qui traitent en japonais d'analyses détaillées de malwares.
Par ailleurs, la lecture des règles YARA permet d'apprendre les caractéristiques des malwares.
Le reverse engineering ne représente qu'une partie de l'analyse de malware, mais c'est un passage obligé pour devenir analyste de malware. Il est difficile d'identifier l'intégralité des fonctionnalités d'un malware ou les algorithmes utilisés uniquement par l'analyse dynamique à l'aide d'un sandbox ou d'outils (à l'exception du débogage manuel).
Pour pratiquer le reverse engineering, il est nécessaire de comprendre le code source d'origine. (En supposant l'environnement Windows courant dans l'analyse de malware) Faire de l'analyse de malware sans expérience de la programmation avec l'API Windows serait un détour.
Microsoft publie la documentation officielle et des exemples pour l'API Windows. ※Attention, certaines parties peuvent s'afficher de manière incorrecte lorsqu'elles sont traduites en japonais
Les livres suivants sont recommandés pour apprendre le fonctionnement du système d'exploitation Windows.
Le C/C++ reste aujourd'hui très important pour apprendre le reverse engineering des malwares Windows, et je le recommande comme premier langage à apprendre. D'un autre côté, les cibles d'analyse réelles ne se limitent pas au C/C++. En 2026, il est utile de connaître au moins les caractéristiques des binaires et runtimes suivants.
Il n'est pas nécessaire d'apprendre en profondeur tous les langages dès le début. Gardez à l'esprit que lorsque le langage de développement ou le runtime change, les connaissances nécessaires changent également.
Une fois que vous avez acquis les compétences en programmation dans le langage et l'environnement cibles de l'analyse, étudiez le reverse engineering. Lors de l'analyse de fichiers PE Windows courants dans l'analyse de malware, commencez par faire du reverse engineering sur un programme d'introduction en C ou C++. Comme étape suivante, analysez un fichier PE utilisant l'API Win que vous avez compilé vous-même (dont le code source existe). Même avec le même code source, en changeant le projet choisi ou les options de compilation et d'édition de liens, et en observant les changements qui apparaissent dans l'exécutable, vous acquerrez considérablement de compétences en reverse engineering.
Auparavant, je recommandais de chercher des exemples Microsoft ou du code sur GitHub et d'apprendre en les modifiant. Cette méthode reste efficace aujourd'hui, mais en 2026, faire créer par un LLM ou un Coding Agent un petit programme adapté à son objectif d'apprentissage est également très efficace.
Par exemple, commencez par faire générer un petit programme d'environ 10 à 50 lignes.```text CreateFileWとWriteFileを使ってテキストファイルを作成する、 できるだけ小さなWindows Cプログラムを作ってください。 リバースエンジニアリングの教材に使いたいので、 処理を複雑にせず、各Windows APIを使う理由も説明してください。
生成されたコードを、Microsoft Learnのドキュメントと照らし合わせながら内容を確認し、自分でコンパイルします。
その後、GhidraやIDAなどで自分がコンパイルしたバイナリを解析し、元のソースコードと逆アセンブル・デコンパイル結果を比較します。
以下のループで勉強します。```text
LLMに小さなコードを作らせる
↓
ソースコードを読む・APIを調べる
↓
自分でビルドする
↓
Ghidraなどで解析する
↓
元のソースコードと比較する
↓
分からない部分だけLLMに質問する
↓
別の条件で再ビルドして比較する
Par exemple, il peut être utile de comparer les éléments suivants pour le code source d'un même traitement.
Analyser un binaire en connaissant le code source d'origine constitue un excellent entraînement pour apprendre le reverse engineering.
Pour affiner davantage vos compétences en reverse engineering, il est recommandé de résoudre des épreuves de Rev en CTF ou des Crackme. Les problèmes portant sur des fichiers PE ou destinés aux analystes de malware sont particulièrement recommandés.
De plus, dans le reverse engineering de malware, il est fréquent de devoir faire du reverse engineering sur le traitement d'algorithmes cryptographiques ; il est donc recommandé d'apprendre les bases de la cryptographie. Une fois l'algorithme compris, lisez le code source d'implémentations open source d'algorithmes cryptographiques publiées sur GitHub ou ailleurs, et essayez de les reverse engineerer vous-même.
Dans le cadre de l'analyse de malware, l'utilisation de meilleurs outils ou la maîtrise de ces outils peut faciliter l'analyse. De plus, même avec des connaissances variées, l'analyse passe en pratique par des outils, il est donc nécessaire de comprendre comment les utiliser.
Pour la gestion de l'installation et de la mise à jour des outils d'analyse, FLARE-VM, publié par Mandiant, est pratique sous Windows. Il permet d'installer en une fois les outils nécessaires à l'analyse de malware et au reverse engineering.
Sous Linux, REMnux est disponible. Celui-ci regroupe également les outils nécessaires à l'analyse de malware, et vous pouvez consulter la liste des outils inclus.
FLARE-VM et REMnux permettent tous deux de construire facilement un environnement d'analyse de malware, et sont donc recommandés même pour une première création d'environnement d'analyse. En consultant les outils inclus dans chacun et en les essayant concrètement, vous pourrez apprendre quels types d'outils d'analyse existent et dans quelles situations les utiliser.
Il est également utile d'essayer les outils présentés dans les liens suivants.
L'une des utilisations pratiques d'un LLM est de s'en servir comme professeur à qui l'on peut poser des questions sur le champ pour ce que l'on ne comprend pas. Avant l'apparition des LLM, il fallait rechercher soi-même ce que l'on ne comprenait pas et en assimiler le contenu. En particulier pour les débutants, il était souvent difficile de savoir quoi rechercher en premier lieu, ce qui constituait un obstacle à l'apprentissage. Aujourd'hui, un LLM doté de connaissances de haut niveau explique patiemment autant de fois que nécessaire, en s'adaptant à votre niveau de compréhension. Si vous ne comprenez pas, vous pouvez simplement reposer la question, et vous pouvez aussi demander « explique plus simplement », « donne un exemple concret », « vérifie si ma compréhension est correcte », etc. Je pense que nous vivons une époque formidable où, avec de la motivation, on peut apprendre en posant autant de questions que l'on veut sur ce que l'on ne comprend pas.
Par exemple, concernant les résultats de désassemblage ou de décompilation, vous pouvez poser les questions suivantes.```text この関数の役割と、そう判断できる理由を教えてください。
## インストール
### 前提条件
- Python 3.8以上
- pip
### インストール手順
1. リポジトリをクローンします:
```bash
git clone https://github.com/yourusername/kitploit-tool.git
cd kitploit-tool
pip install -r requirements.txt
pip install .
docker build -t kitploit-tool .
docker run -it kitploit-tool --help
kitploit-tool --target example.com
| オプション | 説明 |
|---|---|
-t, --target | スキャン対象のターゲットを指定します |
-o, --output | 出力ファイルを指定します |
-v, --verbose | 詳細な出力を有効にします |
# 単一ターゲットのスキャン
kitploit-tool -t 192.168.1.1
# 出力ファイルを指定してスキャン
kitploit-tool -t example.com -o results.txt
# 詳細モードでスキャン
kitploit-tool -t example.com -v
設定ファイルは ~/.config/kitploit-tool/config.yaml に配置されます。
timeout: 30
threads: 10
verbose: false
output_format: json
| 変数名 | 説明 |
|---|---|
KITPLOIT_TIMEOUT | タイムアウト値を秒単位で設定します |
KITPLOIT_THREADS | 使用するスレッド数を設定します |
KITPLOIT_DEBUG | デバッグモードを有効にします |
ツールは以下の形式で出力をサポートしています:
{
"target": "example.com",
"status": "success",
"findings": [
{
"type": "vulnerability",
"severity": "high",
"description": "SQLインジェクションの脆弱性が検出されました"
}
]
}
問題: ツールが起動しない
解決策: Pythonのバージョンが3.8以上であることを確認してください。
python --version
問題: 依存関係のインストールに失敗する
解決策: pipを最新バージョンにアップグレードしてください。
pip install --upgrade pip
問題: 権限エラーが発生する
解決策: 適切な権限で実行するか、sudoを使用してください。
sudo kitploit-tool -t example.com
貢献を歓迎します!以下の手順に従ってください:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)このプロジェクトはMITライセンスの下でライセンスされています。詳細については LICENSE ファイルを参照してください。
このツールは教育および倫理的なテスト目的のみを意図しています。許可なくシステムをスキャンまたは攻撃するためにこのツールを使用することは違法です。ユーザーは自分の行動に対して全責任を負います。```text このデコンパイル結果から変数の型を推定したいです。 型を判断するために、どの命令、API、参照先を確認すべきですか?
## 検出ルールのカスタマイズ
`config/detection_rules.yaml` を編集して、検出ルールをカスタマイズできます。
```yaml
rules:
- name: "AWS Access Key"
pattern: "AKIA[0-9A-Z]{16}"
severity: "critical"
description: "AWS Access Key IDが検出されました"
enabled: true
- name: "Slack Token"
pattern: "xox[baprs]-[0-9a-zA-Z]{10,48}"
severity: "high"
description: "Slackトークンが検出されました"
enabled: true
- name: "Generic API Key"
pattern: "(?i)(api[_-]?key|apikey)[\"']?\\s*[:=]\\s*[\"']?([a-zA-Z0-9_\\-]{16,})"
severity: "medium"
description: "汎用APIキーが検出されました"
enabled: true
rules:
- name: "Custom Internal Token"
pattern: "INTERNAL_[A-Z0-9]{32}"
severity: "high"
description: "社内トークンが検出されました"
enabled: true
特定のファイルやディレクトリをスキャン対象から除外できます。
config/exclude_patterns.yaml:
exclude:
paths:
- "node_modules/**"
- "vendor/**"
- ".git/**"
- "*.min.js"
- "*.min.css"
- "test/fixtures/**"
extensions:
- ".png"
- ".jpg"
- ".gif"
- ".svg"
- ".ico"
- ".woff"
- ".woff2"
- ".ttf"
- ".eot"
files:
- "package-lock.json"
- "yarn.lock"
- "Gemfile.lock"
- "poetry.lock"
コード内でインラインコメントを使用して、特定の行をスキャン対象から除外できます。
# gitleaks:allow
API_KEY = "test_key_for_development"
# secret-scan:ignore-next-line
password = "dummy_password"
// gitleaks:allow
const apiKey = "test_key";
// secret-scan:ignore-next-line
const password = "dummy_password";
secret-scan scan --format json --output results.json
{
"scan_info": {
"target": "./src",
"start_time": "2024-01-15T10:30:00Z",
"end_time": "2024-01-15T10:30:15Z",
"duration_seconds": 15,
"files_scanned": 1250,
"rules_count": 45
},
"findings": [
{
"rule_name": "AWS Access Key",
"severity": "critical",
"file": "src/config/aws.py",
"line": 42,
"column": 15,
"match": "AKIA***************",
"context": "aws_access_key = \"AKIA***************\"",
"commit": "abc123def456",
"author": "[email protected]"
}
],
"summary": {
"total_findings": 1,
"critical": 1,
"high": 0,
"medium": 0,
"low": 0
}
}
secret-scan scan --format sarif --output results.sarif
SARIF形式は、GitHub Code Scanningやその他のセキュリティツールとの統合に適しています。
secret-scan scan --format csv --output results.csv
rule_name,severity,file,line,column,match
AWS Access Key,critical,src/config/aws.py,42,15,AKIA***************
secret-scan scan --format text
[CRITICAL] AWS Access Key
File: src/config/aws.py:42:15
Match: AKIA***************
Description: AWS Access Key IDが検出されました
Summary:
Total: 1
Critical: 1
High: 0
Medium: 0
Low: 0
name: Secret Scan
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
secret-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run Secret Scan
run: |
secret-scan scan --format sarif --output results.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
secret-scan:
stage: test
script:
- secret-scan scan --format json --output results.json
artifacts:
reports:
secret_detection: results.json
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
pipeline {
agent any
stages {
stage('Secret Scan') {
steps {
sh 'secret-scan scan --format json --output results.json'
}
}
}
post {
always {
archiveArtifacts artifacts: 'results.json', fingerprint: true
}
}
}
.pre-commit-config.yaml:
repos:
- repo: https://github.com/example/secret-scan
rev: v1.0.0
hooks:
- id: secret-scan
args: ['--staged']
ベースラインを使用すると、既存の検出結果を記録し、新規の検出結果のみを報告できます。
secret-scan baseline create --output baseline.json
secret-scan scan --baseline baseline.json
secret-scan baseline update --baseline baseline.json
secret-scan baseline diff --baseline baseline.json --current results.json
secret-scan scan --workers 8
secret-scan scan --max-memory 2048
secret-scan scan --timeout 300
secret-scan scan --incremental --since "2024-01-01"
secret-scan scan --cache-dir .secret-scan-cache
secret-scan scan --workers 16 --incremental --cache-dir .cache
secret-scan scan --min-severity high
secret-scan scan --max-memory 4096 --batch-size 100
secret-scan scan --debug --verbose
secret-scan scan --log-file scan.log --log-level debug
``````text
このWindows API呼び出しの前後で使われている構造体について説明してください。
各フィールドを確認するためにGhidra上でどこを見るべきかも教えてください。
id: cmd-injection-001
name: "コマンドインジェクション攻撃"
description: "シェルコマンドの実行を試行する攻撃を検出"
severity: critical
enabled: true
tags: ["injection", "rce", "shell"]
match:
any:
- field: "command"
regex: "(;|&&|\\|\\||`|\\$\\()"
- field: "command"
contains: ["/bin/sh", "/bin/bash", "cmd.exe", "powershell"]
- field: "command"
regex: "(wget|curl|nc|netcat|ncat)\\s+"
actions:
- type: block
- type: alert
priority: high
- type: log
level: error
id: path-traversal-001
name: "パストラバーサル攻撃"
description: "ディレクトリトラバーサル攻撃を検出"
severity: high
enabled: true
tags: ["path-traversal", "lfi"]
match:
any:
- field: "path"
regex: "(\\.\\./|\\.\\.\\\\)"
- field: "path"
contains: ["/etc/passwd", "/etc/shadow", "C:\\Windows\\System32"]
- field: "path"
regex: "(%2e%2e%2f|%2e%2e/|\\.\\.%2f)"
actions:
- type: block
- type: alert
priority: high
- type: log
level: warning
id: sql-injection-001
name: "SQLインジェクション攻撃"
description: "SQLインジェクション攻撃を検出"
severity: critical
enabled: true
tags: ["sql-injection", "database"]
match:
any:
- field: "query"
regex: "(?i)(union\\s+select|select\\s+.*\\s+from|insert\\s+into|delete\\s+from|drop\\s+table)"
- field: "query"
regex: "(?i)(or\\s+1\\s*=\\s*1|and\\s+1\\s*=\\s*1|'\\s+or\\s+')"
- field: "query"
contains: ["--", "/*", "*/", "xp_cmdshell", "information_schema"]
actions:
- type: block
- type: alert
priority: critical
- type: log
level: error
id: xss-001
name: "XSS攻撃"
description: "クロスサイトスクリプティング攻撃を検出"
severity: high
enabled: true
tags: ["xss", "injection"]
match:
any:
- field: "input"
regex: "(?i)(<script|javascript:|onerror\\s*=|onload\\s*=)"
- field: "input"
contains: ["alert('XSS')</script>"
expected:
matched: true
actions: ["sanitize", "alert", "log"]
# すべてのテストを実行
shield test rules
# 特定のルールをテスト
shield test rules --rule cmd-injection-001
# テスト結果を詳細表示
shield test rules --verbose
# テスト結果をJSON形式で出力
shield test rules --format json
# テスト結果をファイルに保存
shield test rules --output test-results.json
# テスト結果の表示
shield test results
# 失敗したテストのみ表示
shield test results --failed
# テストカバレッジの表示
shield test coverage
# テストレポートの生成
shield test report --format html --output test-report.html
# ルールファイルの検証
shield rules validate rules/
# 特定のルールファイルの検証
shield rules validate rules/custom-rule.yaml
# 厳格な検証モード
shield rules validate rules/ --strict
# 検証結果をJSON形式で出力
shield rules validate rules/ --format json
# すべてのルールをデプロイ
shield rules deploy rules/
# 特定のルールをデプロイ
shield rules deploy rules/custom-rule.yaml
# ドライランモード
shield rules deploy rules/ --dry-run
# 強制デプロイ
shield rules deploy rules/ --force
# デプロイの確認
shield rules deploy rules/ --confirm
# 前のバージョンにロールバック
shield rules rollback
# 特定のバージョンにロールバック
shield rules rollback --version 1.2.3
# ロールバックの確認
shield rules rollback --confirm
# ロールバック履歴の表示
shield rules rollback --history
# ルールのバージョン一覧
shield rules versions
# 特定のルールのバージョン履歴
shield rules versions --rule cmd-injection-001
# バージョン間の差分
shield rules diff --from 1.2.3 --to 1.2.4
# 特定のバージョンのエクスポート
shield rules export --version 1.2.3 --output rules-v1.2.3.yaml
# すべてのルールを一覧表示
shield rules list
# 有効なルールのみ表示
shield rules list --enabled
# 無効なルールのみ表示
shield rules list --disabled
# 特定のタグのルールを表示
shield rules list --tag injection
# 特定の重要度のルールを表示
shield rules list --severity critical
# JSON形式で出力
shield rules list --format json
# YAML形式で出力
shield rules list --format yaml
# ルールを有効化
shield rules enable cmd-injection-001
# ルールを無効化
shield rules disable cmd-injection-001
# 複数のルールを有効化
shield rules enable cmd-injection-001 path-traversal-001
# すべてのルールを有効化
shield rules enable --all
# すべてのルールを無効化
shield rules disable --all
# 特定のルールを削除
shield rules delete cmd-injection-001
# 複数のルールを削除
shield rules delete cmd-injection-001 path-traversal-001
# すべてのカスタムルールを削除
shield rules delete --custom
# 削除の確認
shield rules delete cmd-injection-001 --confirm
# すべてのルールをエクスポート
shield rules export --output rules.yaml
# 特定のルールをエクスポート
shield rules export --rule cmd-injection-001 --output rule.yaml
# JSON形式でエクスポート
shield rules export --format json --output rules.json
# ルールをインポート
shield rules import rules.yaml
# ルールをインポート(上書き)
shield rules import rules.yaml --overwrite
# ルールをインポート(マージ)
shield rules import rules.yaml --merge
# ルールの統計を表示
shield rules stats
# 特定のルールの統計
shield rules stats --rule cmd-injection-001
# 期間を指定
shield rules stats --period 24h
# JSON形式で出力
shield rules stats --format json
# ルールのパフォーマンスを表示
shield rules performance
# 特定のルールのパフォーマンス
shield rules performance --rule cmd-injection-001
# パフォーマンスの詳細
shield rules performance --verbose
# パフォーマンスの履歴
shield rules performance --history
# ルールのアラートを表示
shield rules alerts
# 特定のルールのアラート
shield rules alerts --rule cmd-injection-001
# 特定の重要度のアラート
shield rules alerts --severity critical
# 期間を指定
shield rules alerts --period 24h
# JSON形式で出力
shield rules alerts --format json
# ルールのログを表示
shield rules logs
# 特定のルールのログ
shield rules logs --rule cmd-injection-001
# ログレベルを指定
shield rules logs --level error
# 期間を指定
shield rules logs --period 24h
# ログをファイルに保存
shield rules logs --output rules.log
# 良い例
id: cmd-injection-001
name: "コマンドインジェクション攻撃"
# 悪い例
id: rule1
name: "ルール1"
# 良い例
description: "シェルコマンドの実行を試行する攻撃を検出。セミコロン、パイプ、バッククォートなどのシェルメタ文字を検出します。"
# 悪い例
description: "攻撃を検出"
# 重要度の適切な設定
severity: critical # リモートコード実行、SQLインジェクション
severity: high # XSS、パストラバーサル、ブルートフォース
severity: medium # スキャン、レート制限
severity: low # 情報収集、時間帯制限
# テストケースを必ず作成
test_cases:
- name: "正常系のテスト"
input:
command: "ls -la"
expected:
matched: false
- name: "異常系のテスト"
input:
command: "ls; cat /etc/passwd"
expected:
matched: true
# 効率的な正規表現を使用
# 良い例
regex: "^/admin"
# 悪い例
regex: ".*/admin.*"
# タグを活用
tags: ["injection", "rce", "shell", "critical"]
# コメントを追加
# このルールはシェルコマンドの実行を検出します
id: cmd-injection-001
# ルールをGitで管理
git add rules/
git commit -m "Add command injection rule"
git push origin main
# ルールにドキュメントを追加
id: cmd-injection-001
name: "コマンドインジェクション攻撃"
description: |
シェルコマンドの実行を試行する攻撃を検出します。
検出対象:
- シェルメタ文字(;, &&, ||, `, $())
- シェルコマンド(/bin/sh, /bin/bash, cmd.exe, powershell)
- ダウンロードコマンド(wget, curl, nc, netcat, ncat)
参考:
- CWE-78: OS Command Injection
- OWASP Top 10: A03:2021 - Injection
# ルールのレビュー
shield rules review rules/
# 特定のルールのレビュー
shield rules review rules/custom-rule.yaml
# レビュー結果をJSON形式で出力
shield rules review rules/ --format json
# ルールをエクスポートして共有
shield rules export --output shared-rules.yaml
# ルールをインポート
shield rules import shared-rules.yaml
# ルールをGitHubで共有
git clone https://github.com/example/shield-rules.git
# ルールが有効か確認
shield rules list --rule cmd-injection-001
# ルールの構文を確認
shield rules validate rules/custom-rule.yaml
# ルールのテストを実行
shield test rules --rule cmd-injection-001
# ルールのログを確認
shield rules logs --rule cmd-injection-001
# 誤検出のログを確認
shield rules logs --rule cmd-injection-001 --level warning
# ルールの条件を調整
# 除外条件を追加
match:
all:
- field: "command"
regex: "(;|&&|\\|\\||`|\\$\\()"
none:
- field: "command"
contains: ["ls -la", "git status"]
# ルールを無効化
shield rules disable cmd-injection-001
# パフォーマンスを確認
shield rules performance --rule cmd-injection-001
# 正規表現を最適化
# 悪い例
regex: ".*(cmd|exec|system).*"
# 良い例
regex: "^(cmd|exec|system)"
# ルールを分割
# 複雑なルールを複数のシンプルなルールに分割
# ルールの競合を確認
shield rules conflicts
# 特定のルールの競合
shield rules conflicts --rule cmd-injection-001
# 競合を解決
shield rules resolve --rule cmd-injection-001 --priority high
Shieldは、強力なルールエンジンを提供し、カスタムルールの作成、テスト、デプロイ、管理を可能にします。
# ルールの作成
cat > rules/custom-rule.yaml << EOF
id: custom-rule-001
name: "カスタムルール"
description: "カスタムルールの説明"
severity: medium
enabled: true
tags: ["custom"]
match:
any:
- field: "field_name"
equals: "value"
actions:
- type: alert
priority: medium
EOF
# ルールの検証
shield rules validate rules/custom-rule.yaml
# ルールのテスト
shield test rules --rule custom-rule-001
# ルールのデプロイ
shield rules deploy rules/custom-rule.yaml
# ルールの確認
shield rules list --rule custom-rule-001
Shieldのルールエンジンを使用することで、セキュリティ要件に合わせたカスタムルールを作成し、効果的にセキュリティを強化できます。```text このアセンブリを1命令ずつ説明するのではなく、 まずbasic blockごとの役割を整理して、私が自分で処理を推定できるようにヒントをください。
## 検出ルール
| ルール | 説明 |
|------|------|
| `aws_access_key` | AWS アクセスキー ID |
| `aws_secret_key` | AWS シークレットアクセスキー |
| `github_token` | GitHub トークン |
| `github_pat` | GitHub パーソナルアクセストークン |
| `google_api_key` | Google API キー |
| `slack_token` | Slack トークン |
| `slack_webhook` | Slack Webhook URL |
| `private_key` | 秘密鍵 |
| `jwt` | JSON Web Token |
| `password` | パスワード |
| `api_key` | 汎用 API キー |
| `secret` | 汎用シークレット |
| `token` | 汎用トークン |
| `connection_string` | 接続文字列 |
| `database_url` | データベース URL |
| `redis_url` | Redis URL |
| `mongodb_uri` | MongoDB URI |
| `stripe_key` | Stripe キー |
| `twilio_key` | Twilio キー |
| `sendgrid_key` | SendGrid キー |
| `npm_token` | npm トークン |
| `pypi_token` | PyPI トークン |
| `docker_config` | Docker 設定 |
| `kubernetes_config` | Kubernetes 設定 |
| `ssh_key` | SSH 鍵 |
| `pgp_key` | PGP 鍵 |
| `oauth_token` | OAuth トークン |
| `bearer_token` | Bearer トークン |
| `basic_auth` | Basic 認証 |
| `credit_card` | クレジットカード番号 |
| `ssn` | 社会保障番号 |
| `phone_number` | 電話番号 |
| `email_address` | メールアドレス |
| `ip_address` | IP アドレス |
| `url_with_credentials` | 認証情報を含む URL |
## 設定
### 環境変数
| 変数 | 説明 | デフォルト |
|------|------|----------|
| `SCAN_PATH` | スキャンするパス | `.` |
| `SCAN_DEPTH` | スキャンする深さ | `10` |
| `EXCLUDE_PATHS` | 除外するパス | `node_modules,.git,vendor` |
| `EXCLUDE_EXTENSIONS` | 除外する拡張子 | `.jpg,.png,.gif,.pdf` |
| `MAX_FILE_SIZE` | 最大ファイルサイズ | `10485760` |
| `MIN_ENTROPY` | 最小エントロピー | `3.5` |
| `OUTPUT_FORMAT` | 出力形式 | `text` |
| `OUTPUT_FILE` | 出力ファイル | `-` |
| `VERBOSE` | 詳細出力 | `false` |
| `QUIET` | 静かな出力 | `false` |
| `NO_COLOR` | 色なし | `false` |
| `FOLLOW_SYMLINKS` | シンボリックリンクをたどる | `false` |
| `INCLUDE_HIDDEN` | 隠しファイルを含める | `true` |
| `CASE_SENSITIVE` | 大文字と小文字を区別する | `false` |
| `REGEX_PATTERN` | 正規表現パターン | `-` |
| `ENTROPY_THRESHOLD` | エントロピーしきい値 | `4.0` |
| `CONCURRENCY` | 並行処理数 | `10` |
| `TIMEOUT` | タイムアウト | `30` |
| `RETRY_COUNT` | リトライ回数 | `3` |
| `LOG_LEVEL` | ログレベル | `info` |
| `LOG_FILE` | ログファイル | `-` |
| `CONFIG_FILE` | 設定ファイル | `-` |
| `CACHE_DIR` | キャッシュディレクトリ | `-` |
| `TEMP_DIR` | 一時ディレクトリ | `-` |
| `USER_AGENT` | ユーザーエージェント | `-` |
| `PROXY` | プロキシ | `-` |
| `NO_PROXY` | プロキシなし | `-` |
| `SSL_VERIFY` | SSL 検証 | `true` |
| `CA_BUNDLE` | CA バンドル | `-` |
| `CLIENT_CERT` | クライアント証明書 | `-` |
| `CLIENT_KEY` | クライアント鍵 | `-` |
| `AWS_PROFILE` | AWS プロファイル | `-` |
| `AWS_REGION` | AWS リージョン | `-` |
| `AWS_ACCESS_KEY_ID` | AWS アクセスキー ID | `-` |
| `AWS_SECRET_ACCESS_KEY` | AWS シークレットアクセスキー | `-` |
| `AWS_SESSION_TOKEN` | AWS セッショントークン | `-` |
| `GITHUB_TOKEN` | GitHub トークン | `-` |
| `GITLAB_TOKEN` | GitLab トークン | `-` |
| `BITBUCKET_TOKEN` | Bitbucket トークン | `-` |
| `SLACK_TOKEN` | Slack トークン | `-` |
| `DISCORD_TOKEN` | Discord トークン | `-` |
| `TELEGRAM_TOKEN` | Telegram トークン | `-` |
| `TWILIO_ACCOUNT_SID` | Twilio アカウント SID | `-` |
| `TWILIO_AUTH_TOKEN` | Twilio 認証トークン | `-` |
| `SENDGRID_API_KEY` | SendGrid API キー | `-` |
| `STRIPE_API_KEY` | Stripe API キー | `-` |
| `STRIPE_SECRET_KEY` | Stripe シークレットキー | `-` |
| `PAYPAL_CLIENT_ID` | PayPal クライアント ID | `-` |
| `PAYPAL_CLIENT_SECRET` | PayPal クライアントシークレット | `-` |
| `GOOGLE_API_KEY` | Google API キー | `-` |
| `GOOGLE_CLIENT_ID` | Google クライアント ID | `-` |
| `GOOGLE_CLIENT_SECRET` | Google クライアントシークレット | `-` |
| `FACEBOOK_APP_ID` | Facebook アプリ ID | `-` |
| `FACEBOOK_APP_SECRET` | Facebook アプリシークレット | `-` |
| `TWITTER_API_KEY` | Twitter API キー | `-` |
| `TWITTER_API_SECRET` | Twitter API シークレット | `-` |
| `TWITTER_ACCESS_TOKEN` | Twitter アクセストークン | `-` |
| `TWITTER_ACCESS_SECRET` | Twitter アクセスシークレット | `-` |
| `LINKEDIN_CLIENT_ID` | LinkedIn クライアント ID | `-` |
| `LINKEDIN_CLIENT_SECRET` | LinkedIn クライアントシークレット | `-` |
| `DOCKER_USERNAME` | Docker ユーザー名 | `-` |
| `DOCKER_PASSWORD` | Docker パスワード | `-` |
| `DOCKER_REGISTRY` | Docker レジストリ | `-` |
| `KUBECONFIG` | Kubernetes 設定 | `-` |
| `HELM_HOME` | Helm ホーム | `-` |
| `TERRAFORM_TOKEN` | Terraform トークン | `-` |
| `VAULT_TOKEN` | Vault トークン | `-` |
| `VAULT_ADDR` | Vault アドレス | `-` |
| `CONSUL_HTTP_TOKEN` | Consul HTTP トークン | `-` |
| `NOMAD_TOKEN` | Nomad トークン | `-` |
| `DATABASE_URL` | データベース URL | `-` |
| `REDIS_URL` | Redis URL | `-` |
| `MONGODB_URI` | MongoDB URI | `-` |
| `POSTGRES_URL` | PostgreSQL URL | `-` |
| `MYSQL_URL` | MySQL URL | `-` |
| `MSSQL_URL` | MSSQL URL | `-` |
| `ORACLE_URL` | Oracle URL | `-` |
| `SQLITE_PATH` | SQLite パス | `-` |
| `ELASTICSEARCH_URL` | Elasticsearch URL | `-` |
| `KAFKA_BROKERS` | Kafka ブローカー | `-` |
| `RABBITMQ_URL` | RabbitMQ URL | `-` |
| `NATS_URL` | NATS URL | `-` |
| `MQTT_BROKER` | MQTT ブローカー | `-` |
| `SENTRY_DSN` | Sentry DSN | `-` |
| `DATADOG_API_KEY` | Datadog API キー | `-` |
| `NEW_RELIC_LICENSE_KEY` | New Relic ライセンスキー | `-` |
| `PAGERDUTY_API_KEY` | PagerDuty API キー | `-` |
| `OPSGENIE_API_KEY` | Opsgenie API キー | `-` |
| `SLACK_WEBHOOK_URL` | Slack Webhook URL | `-` |
| `DISCORD_WEBHOOK_URL` | Discord Webhook URL | `-` |
| `TEAMS_WEBHOOK_URL` | Teams Webhook URL | `-` |
| `GENERIC_WEBHOOK_URL` | 汎用 Webhook URL | `-` |
| `JWT_SECRET` | JWT シークレット | `-` |
| `SESSION_SECRET` | セッションシークレット | `-` |
| `COOKIE_SECRET` | Cookie シークレット | `-` |
| `CSRF_SECRET` | CSRF シークレット | `-` |
| `ENCRYPTION_KEY` | 暗号化キー | `-` |
| `SIGNING_KEY` | 署名キー | `-` |
| `PRIVATE_KEY` | 秘密鍵 | `-` |
| `PUBLIC_KEY` | 公開鍵 | `-` |
| `CERTIFICATE` | 証明書 | `-` |
| `SSH_PRIVATE_KEY` | SSH 秘密鍵 | `-` |
| `SSH_PUBLIC_KEY` | SSH 公開鍵 | `-` |
| `PGP_PRIVATE_KEY` | PGP 秘密鍵 | `-` |
| `PGP_PUBLIC_KEY` | PGP 公開鍵 | `-` |
| `GPG_KEY` | GPG 鍵 | `-` |
| `NPM_TOKEN` | npm トークン | `-` |
| `PYPI_TOKEN` | PyPI トークン | `-` |
| `RUBYGEMS_API_KEY` | RubyGems API キー | `-` |
| `MAVEN_TOKEN` | Maven トークン | `-` |
| `GRADLE_TOKEN` | Gradle トークン | `-` |
| `NUGET_API_KEY` | NuGet API キー | `-` |
| `CARGO_TOKEN` | Cargo トークン | `-` |
| `GOOGLE_APPLICATION_CREDENTIALS` | Google アプリケーション認証情報 | `-` |
| `AZURE_CLIENT_ID` | Azure クライアント ID | `-` |
| `AZURE_CLIENT_SECRET` | Azure クライアントシークレット | `-` |
| `AZURE_TENANT_ID` | Azure テナント ID | `-` |
| `AZURE_SUBSCRIPTION_ID` | Azure サブスクリプション ID | `-` |
| `GCP_PROJECT_ID` | GCP プロジェクト ID | `-` |
| `GCP_SERVICE_ACCOUNT` | GCP サービスアカウント | `-` |
| `AWS_ACCOUNT_ID` | AWS アカウント ID | `-` |
| `AWS_ROLE_ARN` | AWS ロール ARN | `-` |
| `AWS_LAMBDA_FUNCTION` | AWS Lambda 関数 | `-` |
| `AWS_S3_BUCKET` | AWS S3 バケット | `-` |
| `AWS_DYNAMODB_TABLE` | AWS DynamoDB テーブル | `-` |
| `AWS_SQS_QUEUE` | AWS SQS キュー | `-` |
| `AWS_SNS_TOPIC` | AWS SNS トピック | `-` |
| `AWS_KINESIS_STREAM` | AWS Kinesis ストリーム | `-` |
| `AWS_CLOUDWATCH_LOG_GROUP` | AWS CloudWatch ロググループ | `-` |
| `AWS_SECRETS_MANAGER_SECRET` | AWS Secrets Manager シークレット | `-` |
| `AWS_SSM_PARAMETER` | AWS SSM パラメータ | `-` |
| `AWS_KMS_KEY` | AWS KMS キー | `-` |
| `AWS_IAM_ROLE` | AWS IAM ロール | `-` |
| `AWS_IAM_USER` | AWS IAM ユーザー | `-` |
| `AWS_IAM_POLICY` | AWS IAM ポリシー | `-` |
| `AWS_IAM_GROUP` | AWS IAM グループ | `-` |
| `AWS_IAM_ACCESS_KEY` | AWS IAM アクセスキー | `-` |
| `AWS_IAM_SECRET_KEY` | AWS IAM シークレットキー | `-` |
| `AWS_IAM_SESSION_TOKEN` | AWS IAM セッショントークン | `-` |
| `AWS_IAM_MFA_DEVICE` | AWS IAM MFA デバイス | `-` |
| `AWS_IAM_VIRTUAL_MFA` | AWS IAM 仮想 MFA | `-` |
| `AWS_IAM_PASSWORD_POLICY` | AWS IAM パスワードポリシー | `-` |
| `AWS_IAM_ACCOUNT_PASSWORD_POLICY` | AWS IAM アカウントパスワードポリシー | `-` |
| `AWS_IAM_ACCOUNT_ALIAS` | AWS IAM アカウントエイリアス | `-` |
| `AWS_IAM_ACCOUNT_SUMMARY` | AWS IAM アカウントサマリー | `-` |
| `AWS_IAM_CREDENTIAL_REPORT` | AWS IAM 認証情報レポート | `-` |
| `AWS_IAM_ACCESS_ADVISOR` | AWS IAM Access Advisor | `-` |
| `AWS_IAM_LAST_ACCESSED` | AWS IAM 最終アクセス | `-` |
| `AWS_IAM_SERVICE_LAST_ACCESSED` | AWS IAM サービス最終アクセス | `-` |
| `AWS_IAM_POLICY_SIMULATOR` | AWS IAM ポリシーシミュレーター | `-` |
| `AWS_IAM_ACCESS_ANALYZER` | AWS IAM Access Analyzer | `-` |
| `AWS_IAM_ORGANIZATIONS` | AWS IAM Organizations | `-` |
| `AWS_IAM_SSO` | AWS IAM SSO | `-` |
| `AWS_IAM_IDENTITY_CENTER` | AWS IAM Identity Center | `-` |
| `AWS_IAM_ROLES_ANYWHERE` | AWS IAM Roles Anywhere | `-` |
| `AWS_IAM_OUTBOUND_IDENTITY_FEDERATION` | AWS IAM アウトバウンド ID フェデレーション | `-` |
| `AWS_IAM_INBOUND_IDENTITY_FEDERATION` | AWS IAM インバウンド ID フェデレーション | `-` |
| `AWS_IAM_WEB_IDENTITY` | AWS IAM Web ID | `-` |
| `AWS_IAM_SAML` | AWS IAM SAML | `-` |
| `AWS_IAM_OIDC` | AWS IAM OIDC | `-` |
| `AWS_IAM_COGNITO` | AWS IAM Cognito | `-` |
| `AWS_IAM_COGNITO_USER_POOL` | AWS IAM Cognito ユーザープール | `-` |
| `AWS_IAM_COGNITO_IDENTITY_POOL` | AWS IAM Cognito ID プール | `-` |
| `AWS_IAM_COGNITO_CLIENT` | AWS IAM Cognito クライアント | `-` |
| `AWS_IAM_COGNITO_DOMAIN` | AWS IAM Cognito ドメイン | `-` |
| `AWS_IAM_COGNITO_RESOURCE_SERVER` | AWS IAM Cognito リソースサーバー | `-` |
| `AWS_IAM_COGNITO_USER` | AWS IAM Cognito ユーザー | `-` |
| `AWS_IAM_COGNITO_GROUP` | AWS IAM Cognito グループ | `-` |
| `AWS_IAM_COGNITO_ROLE` | AWS IAM Cognito ロール | `-` |
| `AWS_IAM_COGNITO_POLICY` | AWS IAM Cognito ポリシー | `-` |
| `AWS_IAM_COGNITO_ATTRIBUTE` | AWS IAM Cognito 属性 | `-` |
| `AWS_IAM_COGNITO_MFA` | AWS IAM Cognito MFA | `-` |
| `AWS_IAM_COGNITO_PASSWORD_POLICY` | AWS IAM Cognito パスワードポリシー | `-` |
| `AWS_IAM_COGNITO_ACCOUNT_RECOVERY` | AWS IAM Cognito アカウント復旧 | `-` |
| `AWS_IAM_COGNITO_EMAIL` | AWS IAM Cognito メール | `-` |
| `AWS_IAM_COGNITO_SMS` | AWS IAM Cognito SMS | `-` |
| `AWS_IAM_COGNITO_LAMBDA` | AWS IAM Cognito Lambda | `-` |
| `AWS_IAM_COGNITO_TRIGGER` | AWS IAM Cognito トリガー | `-` |
| `AWS_IAM_COGNITO_UI` | AWS IAM Cognito UI | `-` |
| `AWS_IAM_COGNITO_HOSTED_UI` | AWS IAM Cognito ホスト UI | `-` |
| `AWS_IAM_COGNITO_CUSTOM_UI` | AWS IAM Cognito カスタム UI | `-` |
| `AWS_IAM_COGNITO_FEDERATION` | AWS IAM Cognito フェデレーション | `-` |
| `AWS_IAM_COGNITO_IDENTITY_PROVIDER` | AWS IAM Cognito ID プロバイダー | `-` |
| `AWS_IAM_COGNITO_SAML_PROVIDER` | AWS IAM Cognito SAML プロバイダー | `-` |
| `AWS_IAM_COGNITO_OIDC_PROVIDER` | AWS IAM Cognito OIDC プロバイダー | `-` |
| `AWS_IAM_COGNITO_SOCIAL_PROVIDER` | AWS IAM Cognito ソーシャルプロバイダー | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT` | AWS IAM Cognito アプリクライアント | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_SECRET` | AWS IAM Cognito アプリクライアントシークレット | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_SETTINGS` | AWS IAM Cognito アプリクライアント設定 | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH` | AWS IAM Cognito アプリクライアント OAuth | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_FLOWS` | AWS IAM Cognito アプリクライアント OAuth フロー | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_SCOPES` | AWS IAM Cognito アプリクライアント OAuth スコープ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_CALLBACK` | AWS IAM Cognito アプリクライアント OAuth コールバック | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_LOGOUT` | AWS IAM Cognito アプリクライアント OAuth ログアウト | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_GRANT` | AWS IAM Cognito アプリクライアント OAuth グラント | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_RESPONSE` | AWS IAM Cognito アプリクライアント OAuth レスポンス | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_REFRESH` | AWS IAM Cognito アプリクライアント OAuth リフレッシュ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth アクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth リフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE` | AWS IAM Cognito アプリクライアント OAuth デバイス | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE` | AWS IAM Cognito アプリクライアント OAuth デバイスコード | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_SECRET` | AWS IAM Cognito アプリクライアント OAuth デバイスシークレット | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_REFRESH` | AWS IAM Cognito アプリクライアント OAuth デバイスリフレッシュ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイス ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレット | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_REFRESH` | AWS IAM Cognito アプリクライアント OAuth デバイスコードリフレッシュ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコード ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_REFRESH` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットリフレッシュ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレット ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュ | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンアクセストークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ID_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークン ID トークン | `-` |
| `AWS_IAM_COGNITO_APP_CLIENT_OAUTH_DEVICE_CODE_SECRET_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_REFRESH_TOKEN_ACCESS_TOKEN` | AWS IAM Cognito アプリクライアント OAuth デバイスコードシークレットトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュトークンリフレッシュト```text
私はこの関数を「設定ファイルの読み込み処理」だと推測しました。
この仮説を検証するために確認すべきポイントを挙げてください。
最初から答えを聞くのではなく、ヒント、確認ポイント、検証方法を聞く使い方がおすすめです。
2026年現在は、ChatGPTのような対話型LLMだけでなく、ファイルの読み書き、プログラムのビルド、コマンドの実行などを行えるCoding Agentも利用できるようになっています。 さらに、MCP(Model Context Protocol)などを利用することで、AI Agentから解析ツールを直接操作する方法も広まりつつあります。 例えばREMnuxには、AI AgentからREMnux上のマルウェア解析ツールを利用するためのMCP Serverが用意されています。
Ghidraについても、AI Agentから操作するためのMCP実装がいくつか登場しています。私もGhidraをHeadlessで利用し、MCP経由でAI Agentから解析を行うためのMecha Ghidraを開発しています。
IDAやその他のリバースエンジニアリングツールについても、MCPやAgentと連携するための実装が複数登場しており、これまで人間が手作業で行っていた解析作業をAgentに任せることができるようになっています。 一方で、初学者の段階からすべての解析をAgentに任せてしまうのはおすすめしません。「なぜその解析を行ったのか」「ツールが内部で何をしているのか」「出力された結果が正しいのか」といったことを自分で判断する力が身につきにくくなるためです。
まずは自分で解析し、分からない部分をLLMに質問するところから始めるとよいでしょう。慣れてきたら、解析支援スクリプトの作成、MCPによるツール連携、Agentを使った解析の自動化へと徐々に進んでいくことをおすすめします。
業務で扱っているマルウェア、顧客から提供されたファイル、未公開のIoC、インシデント情報、社内情報などを外部のLLMサービスへ入力する場合には注意が必要です。 利用しているサービスの契約内容、データの保持期間、学習への利用有無、所属組織のルールなどを確認したうえで利用しましょう。
必要に応じて、以下のような対策を検討してください。
また、マルウェア本体や解析対象のファイル、解析結果の中には、AI Agentを意図しない動作へ誘導する文字列が含まれている可能性もあります。 特に、AI Agentがファイル操作やコマンド実行、解析ツールの操作まで行える場合は、通常のLLMよりも強い権限を持つことになります。そのため、マルウェア解析でAI Agentを利用する場合は、VMなどの隔離環境上で実行し、安全性を確保することをおすすめします。
AIはかなり賢くなりましたが、それでも意図しないコマンドを実行することがあります。 これまでのマルウェア解析と同様に解析環境を隔離するという基本を守って利用しましょう。
2026年現在、マルウェア解析を勉強するために、最初から実際のマルウェアを入手する必要はありません。 むしろ初学者には、以下の順番をおすすめします。
最初のうちは、元のソースコードが分かっているプログラムを教材にするのがおすすめです。 自分で解析した結果と実際のソースコードを比較できるため、「どこまで正しく解析できたか」「どこを読み違えたか」を自分で確認できます。 いきなり実際のマルウェアを解析するよりも、まずは答え合わせのできる教材を使って、逆アセンブルやデコンパイル結果の読み方に慣れる方が効率よく学習できると思います。
ここではマルウェアの入手方法について触れますが、紹介するサービスを利用する際は利用規約を必ず読んで利用してください。 また、以下の内容は、マルウェアの入手を勧めるものではありません。
不正指令電磁的記録に関する罪では、マルウェアの作成、提供、取得、保管などについて、その目的や正当な理由の有無などが要件になります。
私は法律の専門家ではないため、どういった理由であれば法律上の正当な理由にあたるかはわかりません。
個人の趣味でマルウェア解析をおこなうことは正当な理由として認められない可能性もあります。
捜査されると困る、裁判になったら困る、正当な理由として提示できる活動実績がない、弁護費用がないなど、平穏な人生を絶対に送りたいという人は、個人の趣味でやらないほうがよいかと思います。
とはいえ過度に怯えすぎて萎縮する必要はないとは思います。 最低限、警視庁が公開している不正指令電磁的記録に関する罪に関するページには目を通して、内容を確認しておきましょう。
マルウェアを扱う上で気にしなければいけないことは、法律面だけではありません。 マルウェアを実行(故意かどうかは問わない)すると、たいていの場合は攻撃者の用意したサーバにアクセスします。 攻撃者のサーバには自分の利用しているIPアドレスのログが残りますし、接続時に利用しているシステムの情報を送信することもあります。 マルウェアによっては、攻撃者によるコマンドの実行などがおこなわれることも考えられますし、内部ネットワークのスキャンや(一番避けるべき)外部への感染活動などがおこなわれるかもしれません。 攻撃者のサーバに記録された情報は攻撃者自身だけでなく、第三者へ提供されることもあります。また、捜査機関はサーバを差し押さえてログを解析したうえで、ISPに情報開示請求をおこなうことができます。
以下のどれか一つにでも当てはまる場合は、実際のマルウェアを利用した学習は控えましょう。
実際のマルウェアを個人的に入手しなくても、学習する方法は前述しております。
最後にオタクがみんな大好きな以下の名言たちで前置きを終えます。
With great power comes great responsibilityThe abyss gazes also into you.マルウェアのサンプルやIoCを共有するためのサービスがいくつかあります。もっとも登録が多く有名なサービスはVirusTotalですが、有償アカウントのみダウンロードが可能であるため、ここでは無償で利用可能なサービスを紹介します。
この2つのサービスがサンプルの入手先としては有力です。
参考情報として以下のサービスも記載しておきます。
無料で使用できるオンラインサンドボックスのサービスは本来マルウェアの挙動を解析するサービスですが、他者の投稿したマルウェアをダウンロードすることができます。
以下はRAT(Remote Access Trojan)の実装を理解するのに役に立つリポジトリです。 ソースコードと実際のバイナリを比較することで、通信処理、コマンド実行、ファイル操作などの実装を学ぶことができます。
マルウェアのC2通信やAgentの実装を理解するためには、オープンソースで公開されているC2フレームワークのソースコードを読むことも参考になります。 C2フレームワークには、AgentとC2 Server間の通信、コマンドの受信と実行、ファイル操作、プロセス操作、通信データの暗号化など、マルウェアでもよく見られる機能が実装されています。 それぞれ実装言語やAgentの構造、通信方式が異なるため、ソースコードと生成されたAgentを比較しながらリバースエンジニアリングしてみるのもよいでしょう。
-h, --help | ヘルプメッセージを表示します |
| パラメータ | 型 | 説明 |
|---|
name | string | ルール名 |
pattern | string | 正規表現パターン |
severity | string | 重要度(critical、high、medium、low) |
description | string | 検出時の説明 |
enabled | boolean | ルールの有効/無効 |