Day082 - 生成AIで作るセキュリティツール100
Global Cultural Scam Atlas(GCSA) は、各国・地域で観測される 文化・慣習の文脈を悪用したソーシャルエンジニアリング を、教育目的で整理する オープンなデータベース です。
特定の国民性を一般化する意図はなく、「攻撃者がその傾向を悪用しうる」 という観点で事例を記述します。
👉 https://ipusiron.github.io/global-cultural-scam-atlas/
ブラウザーで直接お試しいただけます。
本プロジェクトの本質は、各攻撃事例を構造化した JSONデータベース にあります。 フロントエンドは軽量なHTML/CSS/JavaScriptで構成され、複雑なフレームワークは使用していません。
データベースをGitHub上で公開・管理するにあたり、継続的インテグレーション(CI)を活用することで品質を担保しています。 このCI環境により、スキーマ検証・自動ビルド・デプロイが自動化され、やや複雑な構成となっていますが、データの正確性と一貫性を保つために不可欠な仕組みです。
- 多言語対応: 日本語/英語の切り替え(ボタン1つで全UI・データを切り替え)
- テーマ切り替え: ライト/ダークモード対応(システム設定を自動検出)
- 高度なフィルタリング:
- 国別フィルター
- 攻撃ベクター別フィルター(in-person, phone, email, socialなど)
- 全文検索(タイトル・説明・シナリオ・タグを横断検索)
- フィルターリセット機能
- 視覚的なリスク表示: 5段階のリスクスコアを色分け表示(★1〜5)
- 詳細モーダル: 各攻撃の詳細情報(Cultural Lever、Scenario、Red Flags、Mitigations、Referencesなど)
- レスポンシブデザイン: デスクトップ・タブレット・スマートフォンに対応
- アクセシビリティ: キーボード操作対応、aria-label設定
- 旅行者・生活者・教育機関・実務家が Red Flags(兆候) と Mitigations(対策) を素早く学べる。
- データは 一次情報(公的機関、CERT、学術) を中心に継続更新。
状況: 日本人旅行者がアジア諸国へ2週間の旅行を計画している。
活用方法:
- 渡航先の国コードでフィルタリングし、その国で報告されている攻撃事例を一覧表示
attack_vector: in-personでフィルタリングして、現地で遭遇しやすい対面型の詐欺を確認- 各攻撃の「Red Flags(警告兆候)」をスマートフォンにメモし、現地で警戒すべきポイントを把握
- 「Mitigations(対策)」を事前に読み、断り方や対応フレーズを準備
効果: 事前知識により警戒心が高まり、詐欺被害のリスクを大幅に軽減。現地での判断力向上。
状況: 多国籍企業が海外赴任者向けのセキュリティ研修を実施。
活用方法:
- 赴任先国の攻撃事例データをAPIで取得し、社内研修システムに統合
risk_score >= 4の高リスク攻撃を優先的に研修カリキュラムに組み込むattack_vector: phone,email,socialなど、リモートワーク環境で遭遇しやすい攻撃を重点的に解説- 各国の「Cultural Lever(文化的レバー)」を理解することで、なぜその国でその手口が有効なのかを深く学習
効果: 実例ベースの研修により、従業員の危機意識が向上。文化的背景の理解により、現地での適応力も強化。
状況: サイバーセキュリティ研究者が、ソーシャルエンジニアリングの地域別傾向を分析。
活用方法:
dist/countries.jsonを定期的にダウンロードし、攻撃パターンの時系列変化を追跡attack_vector,targets,tagsの出現頻度を分析し、地域ごとの攻撃手法の違いを可視化- 複数国で共通する
cultural_leverを抽出し、文化横断的な脆弱性を研究 - 新興の攻撃手法(新しい
tagsやmediums)を早期発見し、論文や警告レポートを執筆
効果: オープンデータを活用した研究により、学術的知見の蓄積と新たな防御策の提案が可能に。
- 1攻撃 = 1ファイル(
data/attacks/{ISO2}/{id}.json) - ビルド時に
dist/countries.jsonへ集約(ツール内配信用) - スキーマ:
data/schema.json
本リポジトリでは 「1攻撃=1ファイルで管理し、ビルド時に集約するハイブリッド運用」 を採用します。理由は以下です。
- 並行編集に強い:差分が小さく、PRレビューが攻撃単位で完結。衝突が減る。
- トレーサビリティ向上:出典・変更履歴・責任範囲を攻撃ファイルごとに明確化。
- ローカライズ容易:各ファイルに
ja/enを内包し、翻訳粒度を制御。 - 配信効率:編集は分割、公開は集約でクライアント負荷を最小化。
- CIで品質担保:スキーマ検証・語彙Lint・リンクチェックをファイル単位で実行し、不整合の流出を防止。
本プロジェクトの集約データ dist/countries.json を利用して、独自のアプリケーションやツールを構築できます。APIキー不要で、誰でも自由にアクセス可能です。
公開されているJSONファイルを直接取得できます:
const response = await fetch('https://ipusiron.github.io/global-cultural-scam-atlas/dist/countries.json');
const data = await response.json();
console.log(data);{
"version": "1.0.0",
"last_updated": "2025-01-15",
"countries": [
{
"country_code": "JP",
"country_name_local": "日本",
"country_name_en": "Japan",
"regions": ["APAC"],
"language_codes": ["ja", "en"],
"notes": "教育目的。一般化を意図しない注記。",
"attacks": [
{
"id": "jp-001",
"title": { "ja": "親切装う道案内からの押し売り", "en": "Good Samaritan Hard Sell" },
"short_desc": { "ja": "観光地で親切装い→店舗へ誘導→高額購入圧力", "en": "..." },
"cultural_lever": { "ja": "対立回避・断りづらさ", "en": "..." },
"attack_vector": ["in-person"],
"targets": ["tourist", "general"],
"scenario": { "ja": "...", "en": "..." },
"red_flags": { "ja": ["急かされる", "限定割引の強調"], "en": ["..."] },
"mitigations": { "ja": ["即決しない", "正規案内所を利用"], "en": ["..."] },
"risk_score": 3,
"mediums": ["cash", "credit"],
"legal_notes": { "ja": "", "en": "" },
"references": [
{ "label": "参考記事", "url": "https://example.com" }
],
"tags": ["tourism", "pressure-sales", "social-engineering"]
}
]
}
]
}| フィールド | 型 | 説明 |
|---|---|---|
id |
String | 攻撃の一意識別子(例: jp-001) |
title |
Object | 攻撃の名称(多言語対応:ja, en) |
short_desc |
Object | 短い説明文(多言語対応) |
cultural_lever |
Object | 悪用される文化的傾向(多言語対応) |
attack_vector |
Array | 攻撃経路(in-person, phone, email, sms, social, website, payment-app, postal, door-to-door, marketplace) |
targets |
Array | 標的(tourist, elderly, student, generalなど) |
scenario |
Object | 攻撃の流れ(多言語対応) |
red_flags |
Object | 警告兆候のリスト(多言語対応) |
mitigations |
Object | 対策のリスト(多言語対応) |
risk_score |
Number | リスクスコア(1〜5、5が最高リスク) |
mediums |
Array | 決済手段(cash, credit, bank-transferなど) |
legal_notes |
Object | 法的注記(多言語対応、オプション) |
references |
Array | 参考文献・出典のリスト(label, urlを含むオブジェクト配列) |
tags |
Array | タグ(tourism, pressure-sales, social-engineering, scarcity, urgencyなど) |
特定の国の攻撃を取得:
const jpAttacks = data.countries.find(c => c.country_code === 'JP').attacks;リスクスコアでフィルタリング:
const highRisk = data.countries.flatMap(c => c.attacks)
.filter(atk => atk.risk_score >= 4);attack_vectorで検索:
const phoneScams = data.countries.flatMap(c => c.attacks)
.filter(atk => atk.attack_vector.includes('phone'));本プロジェクトの核心はデータです。 ツール自体は軽量なHTML/CSS/JavaScriptで構成されたシンプルな構造ですが、データベースをGitHub上で公開・管理するために、CI(継続的インテグレーション)を活用した品質管理体制 を整えています。このCI環境が、やや複雑に見える構成の理由です。
本プロジェクトで公開される dist/countries.json は、リポジトリ内の個別攻撃データを自動で集約して生成しています。
ユーザーがアクセスするURL:
👉 https://ipusiron.github.io/global-cultural-scam-atlas/dist/countries.json
-
ソースデータ
- 各攻撃は 1ファイル単位で管理されます(例:
data/attacks/JP/jp-001.json,data/attacks/US/us-001.json)。
- 各攻撃は 1ファイル単位で管理されます(例:
-
ビルドスクリプト
tools/build-countries.mjsが全攻撃ファイルを読み込み、国ごとにグルーピング。- メタ情報(
version,last_updated,countries[])を加えてdist/countries.jsonを生成します。
抜粋:
const files = await glob("data/attacks/*/*.json"); const grouped = {}; // 国ごとにまとめて countries[] を構築 const out = { version: "1.0.0", last_updated: today(), countries }; await fs.writeFile("dist/countries.json", JSON.stringify(out, null, 2));
-
package.jsonスクリプト
"scripts": { "build:index": "node tools/build-index.mjs", "build:countries": "node tools/build-countries.mjs", "build": "npm run build:index && npm run build:countries" }
npm run build実行でdist/countries.jsonが生成されます。
-
CI/CD(GitHub Actions)
本プロジェクトでは、データの品質担保と自動デプロイ のために2つのワークフローを運用しています。
a.
.github/workflows/ci.yml(品質チェック)- PR作成時・
mainブランチへのpush時に自動実行 npm run buildでデータを集約npm run validate:schemaでdist/countries.jsonがスキーマに準拠しているか検証- これにより、不正なデータ形式やスキーマ違反を本番環境に流入させません
b.
.github/workflows/pages.yml(自動デプロイ)mainブランチへのpush時に起動- ワークフローの中で
npm run buildが実行され、dist/countries.jsonが生成されます - 生成された
dist/countries.jsonとdocs/index.htmlなどの静的資産をpublic/にコピーします peaceiris/actions-gh-pagesを用いてgh-pagesブランチへ自動デプロイされます
- PR作成時・
-
公開
- GitHubの Settings → Pages にて、Sourceを
gh-pages / (root)に設定します。 - 数十秒後、GitHub Pagesにより自動的に公開されます。
- 公開URL例:
本プロジェクトは、シンプルなツール構造 と 堅牢なデータ管理 を両立させています。
- ツール: 軽量なHTML/CSS/JavaScript(フレームワークなし)
- データ: JSON形式で構造化された攻撃事例データベース(
data/attacks/{ISO2}/{id}.json) - 品質管理: CIによるスキーマ検証(
.github/workflows/ci.yml) - 生成先:
dist/countries.json(ビルド時に自動集約) - 公開ブランチ:
gh-pages - 公開手段: GitHub Actions + GitHub Pages(
.github/workflows/pages.yml)
CIを活用することで、データの正確性・一貫性を維持しながら、誰でも安心してデータを追加・更新できる環境を実現しています。
GitHub Pagesで公開するにあたり、以下のセキュリティ対策を実装しています。
1. Content Security Policy (CSP)
- スクリプトとスタイルシートは同一オリジンのみ許可
- インラインスクリプトを禁止し、XSS攻撃を防止
- 外部リソースの読み込みを制限
2. セキュアなHTTPヘッダー
X-Frame-Options: DENY- クリックジャッキング防止X-Content-Type-Options: nosniff- MIMEタイプスニッフィング防止Referrer-Policy: no-referrer-when-downgrade- リファラー情報の適切な制御.htaccessによるApache環境でのセキュリティヘッダー設定
3. データ検証とサニタイゼーション
- JSONデータの構造検証を実行時に実施
- すべてのユーザー表示データをHTMLエスケープ
- 外部リンクのURL検証(http/httpsのみ許可)
rel="noopener noreferrer"による外部リンクの安全化
4. 安全なデータ取得
fetchAPIでsame-originモードを使用- JSON.parse前のデータ検証
これらの対策により、静的サイトでありながら高いセキュリティレベルを維持しています。
本データは教育目的であり、特定の国・文化・人々を一般化する意図はありません。出典は可能な限り一次情報を示し、リンク切れや更新は随時対応します。
global-cultural-scam-atlas/
├── .github/
│ └── workflows/
│ ├── ci.yml # 品質チェック(スキーマ検証)
│ └── pages.yml # GitHub Pagesへの自動デプロイ
│
├── data/
│ ├── attacks/ # 攻撃事例データ(1攻撃=1ファイル)
│ │ ├── JP/ # 日本の攻撃事例
│ │ │ ├── jp-001.json
│ │ │ ├── jp-002.json
│ │ │ └── ...
│ │ ├── US/ # アメリカの攻撃事例
│ │ │ └── us-001.json
│ │ ├── IN/ # インドの攻撃事例
│ │ │ └── in-001.json
│ │ └── ... # 他の国(追加予定)
│ │
│ ├── index.json # 攻撃IDのインデックス(ビルド生成)
│ └── schema.json # JSONスキーマ定義(draft-07)
│
├── docs/ # 公開用静的サイト
│ ├── index.html # メインページ
│ ├── style.css # スタイルシート
│ ├── js/
│ │ └── main.js # フロントエンドロジック
│ ├── .htaccess # Apacheセキュリティヘッダー
│ └── content-guidelines.md # コンテンツ編集ガイドライン
│
├── dist/ # ビルド生成物(公開データ)
│ └── countries.json # 集約された攻撃データベース
│
├── tools/ # ビルドスクリプト
│ ├── build-index.mjs # data/index.json 生成
│ └── build-countries.mjs # dist/countries.json 生成
│
├── CLAUDE.md # Claude Code向けガイド
├── README.md # プロジェクト説明
├── LICENSE # MITライセンス
├── package.json # npm設定・スクリプト定義
└── package-lock.json # 依存関係ロック
| ファイル/ディレクトリ | 役割 |
|---|---|
data/attacks/{ISO2}/{id}.json |
個別の攻撃事例データ(編集対象) |
data/schema.json |
攻撃データのJSON Schema定義(draft-07準拠) |
tools/build-index.mjs |
data/index.jsonを生成(国別攻撃IDインデックス) |
tools/build-countries.mjs |
個別データを集約してdist/countries.jsonを生成 |
dist/countries.json |
API公開用の集約データ(自動生成) |
docs/index.html |
Webインターフェイス(多言語・テーマ切り替え対応) |
docs/style.css |
スタイルシート(ライト/ダークモード対応) |
docs/js/main.js |
フロントエンドロジック(検索・フィルタリング・i18n) |
docs/.htaccess |
Apacheセキュリティヘッダー設定 |
docs/content-guidelines.md |
コンテンツ編集ガイドライン |
.github/workflows/ci.yml |
PRとpush時のスキーマ検証 |
.github/workflows/pages.yml |
GitHub Pagesへの自動デプロイ |
CLAUDE.md |
Claude Code向け開発ガイド |
MIT License – 詳細は LICENSE を参照してください。
本ツールは、「生成AIで作るセキュリティツール100」プロジェクトの一環として開発されました。 このプロジェクトでは、AIの支援を活用しながら、セキュリティに関連するさまざまなツールを100日間にわたり制作・公開していく取り組みを行っています。
プロジェクトの詳細や他のツールについては、以下のページをご覧ください。
