お疲れ様です!IT業界で働くアライグマです!
先日、あるWebアプリケーションのセキュリティ監査で、JavaScriptのXSS脆弱性がペネトレーションテストで発覚しました。
問題は、手動レビューでは見落としていた箇所に脆弱性が潜んでいたこと。
「コードレビューはしているのに、なぜ脆弱性が見つかるのか?」
実際、OWASPのレポートによると、Webアプリケーションの約70%がなんらかのJavaScript関連の脆弱性を抱えているとされています。
この課題を解決するために導入したのが、JSAnalyzerというPythonベースの静的解析ツールです。
本記事では、JSAnalyzerの導入から実際のCI/CD統合まで、具体的な実装例とともに解説します。
JSAnalyzerとは:なぜ今JavaScript静的解析が重要なのか
JSAnalyzerは、GitHubで公開されているPython製のJavaScript静的解析ツールです。
AST(抽象構文木)ベースの解析を行うことで、単純なパターンマッチングでは検出できない脆弱性を発見できます。
従来ツールとの違い
ESLintやSonarQubeなど既存ツールとの最大の違いは、セマンティック解析に特化している点です。
- ESLint: コーディング規約違反の検出が主目的。セキュリティルールは限定的
- SonarQube: 多言語対応で広範囲だが、JavaScript固有の脆弱性パターンは限定的
- JSAnalyzer: JavaScript/TypeScript専用で、XSS・インジェクション・プロトタイプ汚染に特化
mongobleedで発覚したMongoDBの脆弱性と対策でも触れましたが、セキュリティツールは専門性と汎用性のバランスが重要です。
IT女子 アラ美JSAnalyzerの導入とセットアップ
JSAnalyzerはPython 3.8以上で動作します。
以下の手順でセットアップしましょう。
インストール
# リポジトリのクローン
git clone https://github.com/jenish-sojitra/JSAnalyzer.git
cd JSAnalyzer
# 依存関係のインストール
pip install -r requirements.txt
# 動作確認
python jsanalyzer.py --version
基本的な使用方法
# 単一ファイルの解析
python jsanalyzer.py --file /path/to/target.js
# ディレクトリ全体の解析
python jsanalyzer.py --dir /path/to/project/src
# レポート出力(JSON形式)
python jsanalyzer.py --dir ./src --output report.json --format json
設定ファイルのカスタマイズ
jsanalyzer.config.yamlで検出ルールをカスタマイズできます。
# jsanalyzer.config.yaml
rules:
xss:
enabled: true
severity: high
prototype_pollution:
enabled: true
severity: critical
sql_injection:
enabled: true
severity: high
exclude:
- node_modules/
- dist/
- "*.min.js"
Ghosttyで開発効率を上げるでも解説しましたが、設定ファイルは開発チーム全体で共有することで、一貫した基準を維持できます。



脆弱性検出の実践:主要パターンと対策
JSAnalyzerが検出する主な脆弱性パターンを見ていきましょう。


パターン1:XSS(クロスサイトスクリプティング)
// 危険なコード例(JSAnalyzerが検出)
document.getElementById('output').innerHTML = userInput;
// 修正後のコード
document.getElementById('output').textContent = userInput;
JSAnalyzerはinnerHTMLへの直接代入を検出し、textContentへの置換を提案します。
パターン2:プロトタイプ汚染
// 危険なコード例(JSAnalyzerが検出)
function merge(target, source) {
for (let key in source) {
target[key] = source[key]; // __proto__ 経由で汚染される可能性
}
}
// 修正後のコード
function merge(target, source) {
for (let key in source) {
if (Object.prototype.hasOwnProperty.call(source, key) && key !== '__proto__') {
target[key] = source[key];
}
}
}
パターン3:eval関数の危険な使用
// 危険なコード例(JSAnalyzerが検出)
const result = eval(userProvidedCode);
// 修正方針:evalの使用を避け、代替手段を検討
// JSON.parse や Function コンストラクタの限定使用など
GoでHeadless Workflow Engineを構築するでも触れましたが、外部入力を直接コードとして実行するパターンは、言語を問わず危険です。



CI/CDパイプラインへの統合
JSAnalyzerをCI/CDに統合することで、脆弱性のあるコードがマージされる前に検出できます。
GitHub Actionsでの統合例
# .github/workflows/security-scan.yml
name: Security Scan
on: [push, pull_request]
jobs:
jsanalyzer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install JSAnalyzer
run: |
git clone https://github.com/jenish-sojitra/JSAnalyzer.git /tmp/jsanalyzer
pip install -r /tmp/jsanalyzer/requirements.txt
- name: Run Security Scan
run: |
python /tmp/jsanalyzer/jsanalyzer.py --dir ./src --output report.json --format json
- name: Check for Critical Issues
run: |
CRITICAL=$(cat report.json | jq '.issues | map(select(.severity == "critical")) | length')
if [ "$CRITICAL" -gt 0 ]; then
echo "❌ Critical vulnerabilities found: $CRITICAL"
exit 1
fi
検出結果のSlack通知
重要な脆弱性が検出された場合、即座にチームへ通知することで、迅速な対応が可能になります。
- name: Notify Slack on Critical Issues
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "🚨 JSAnalyzer: Critical vulnerability detected in ${{ github.repository }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
claude-code-safety-netで安全なAIコーディングでも解説しましたが、セキュリティツールはCI/CDへの統合が効果を最大化します。



ケーススタディ:ECサイトの脆弱性ゼロを実現した導入事例
ここでは、実際にJSAnalyzerを導入し、セキュリティ改善を達成した事例を紹介します。
状況(Before)
- Dさん(35歳)、ECサイト運営企業のバックエンドエンジニア
- フロントエンドはReact + TypeScriptで構築、約15万行のコードベース
- 年に2回の外部ペネトレーションテストで、毎回3〜5件の脆弱性が検出
- 手動コードレビューでは見落としが発生し、リリース後に発覚するケースも
行動(Action)
- JSAnalyzerを導入し、GitHub Actionsに統合。全PRで自動スキャンを実施することで、脆弱性のあるコードがマインブランチにマージされる前に検出
- 検出ルールをチームでカスタマイズし、jsanalyzer.config.yamlをリポジトリに追加。XSS・プロトタイプ汚染・eval使用を特に重点的にチェック
- 週次でスキャンレポートを自動生成し、技術定例会で共有。検出された脆弱性パターンをチーム全体で学習することで、同種の問題の再発を防止
- Critical・Highの脆弱性が検出された場合はSlack通知を設定し、即座に担当者へエスカレーション。平均対応時間を従来の3日から4時間に短縮
結果(After)
- 導入後12ヶ月間で、外部ペネトレーションテストでの脆弱性検出数がゼロに
- コードレビュー時間が約30%短縮(セキュリティ観点の指摘が減少したため)
- チーム全体のセキュリティ意識が向上し、脆弱性パターンを理解したコーディングが定着
- セキュリティ関連のインシデント対応コストが年間約200万円削減
smart-coding-mcpでAIアシスタントにセマンティックコード検索を追加するも参考に、開発ツールチェーンの最適化を進めましょう。



セキュリティスキルの習得と活用
セキュリティツールを効果的に活用するには、基礎知識の習得が重要です。
以下の比較表を参考に、自分に合った学習方法を選びましょう。
IQuest-Coderで自律型AIエージェントを構築するも参考に、AI時代のスキルセットを拡充しましょう。
本記事で解説したようなAI技術を、基礎から体系的に身につけたい方は、以下のスクールも検討してみてください。
| 比較項目 | DMM 生成AI CAMP | Aidemy Premium |
|---|---|---|
| 目的・ゴール | ビジネス活用・効率化非エンジニア向け | エンジニア転身・E資格Python/AI開発 |
| 難易度 | プロンプト作成中心 | コード記述あり |
| 補助金・給付金 | リスキリング補助金対象 | 教育訓練給付金対象 |
| おすすめ度 | 今の仕事に活かすなら | AIエンジニアになるなら |
| 公式サイト | 詳細を見る | 詳細を見る |



まとめ
JavaScriptの脆弱性対策において、JSAnalyzerは強力な武器になります。
- AST解析によりパターンマッチングでは検出困難な脆弱性を発見
- ESLintやSonarQubeと併用することで、多層的なセキュリティ対策を実現
- CI/CDへの統合により、脆弱性のあるコードがマージされる前にブロック
- 継続的なスキャンとチーム共有により、セキュリティ意識の向上にも貢献
セキュリティ対策は「やるかやらないか」ではなく「いつ始めるか」の問題です。
今日からJSAnalyzerを導入し、コードベースの安全性を高めましょう。













