LESSON 30分

OWASP Top 10を知ろう

ストーリー

高橋さんがホワイトボードの前に立った。

「攻撃に対処する前に、まず敵を知ろう。Webアプリケーションの脆弱性には パターンがある。それをまとめたのがOWASP Top 10だ」

「OWASP......聞いたことはありますが、詳しくは......」

「Open Web Application Security Project。世界中のセキュリティ専門家が まとめた、Webアプリケーションの重大なリスクのランキングだ。 これを理解していないエンジニアは、地図なしで戦場に出るようなものだよ」


OWASPとは

OWASP(Open Web Application Security Project) は、Webアプリケーションセキュリティの向上を目的とするオープンコミュニティです。

  • 非営利団体が運営
  • セキュリティに関するツール、ドキュメント、ガイドラインを無償公開
  • OWASP Top 10 は最も影響力のあるセキュリティリスクのランキング

OWASP Top 10(2021年版)

一覧

順位カテゴリ概要
A01アクセス制御の不備権限チェックの漏れ
A02暗号化の失敗機密データの保護不足
A03インジェクションSQLi、XSS、コマンドインジェクション
A04安全でない設計設計レベルのセキュリティ欠陥
A05セキュリティの設定ミスデフォルト設定、不要な機能の有効化
A06脆弱で古いコンポーネント既知の脆弱性を持つライブラリの使用
A07識別と認証の失敗認証メカニズムの不備
A08ソフトウェアとデータの整合性の不備検証なしのアップデート、CI/CDの不備
A09セキュリティログと監視の不備攻撃検知の遅れ
A10サーバーサイドリクエストフォージェリ(SSRF)サーバーを利用した内部リクエストの偽装

各カテゴリの詳細

A01: アクセス制御の不備

本来アクセスできないリソースにアクセスできてしまう問題です。

typescript
// 脆弱な例: ユーザーIDのチェックなし
app.get('/api/users/:id/profile', async (req, res) => {
  const profile = await db.getUserProfile(req.params.id);
  res.json(profile); // 誰でも他人のプロフィールを取得できる
});

// セキュアな例: 認可チェック付き
app.get('/api/users/:id/profile', authMiddleware, async (req, res) => {
  if (req.user.id !== req.params.id && req.user.role !== 'admin') {
    return res.status(403).json({ error: 'Forbidden' });
  }
  const profile = await db.getUserProfile(req.params.id);
  res.json(profile);
});

A02: 暗号化の失敗

機密データが適切に暗号化されていない問題です。

危険なパターン:
- パスワードの平文保存
- HTTPでの機密データ送信(HTTPSを使わない)
- 古い暗号化アルゴリズム(MD5, SHA1)の使用
- 暗号化キーのハードコーディング

A03: インジェクション

外部からの入力がコードやクエリの一部として解釈されてしまう問題です。

主なインジェクションの種類:
├── SQLインジェクション       → データベースの不正操作
├── クロスサイトスクリプティング → ブラウザでの不正スクリプト実行
├── コマンドインジェクション    → OSコマンドの不正実行
└── LDAPインジェクション      → ディレクトリサービスの不正操作

このカテゴリが今月のミッションの中心です。

A04: 安全でない設計

コードの実装ではなく、設計段階でのセキュリティの欠如です。

例:
- パスワードリセットが秘密の質問のみ(推測可能)
- レート制限なしのAPI(ブルートフォース攻撃が可能)
- 重要な操作に対する再認証なし

A05: セキュリティの設定ミス

システムやフレームワークの設定が不適切な問題です。

危険な設定:
- デフォルトのパスワードを変更していない
- 不要なポートやサービスが開いている
- エラーメッセージにスタックトレースが含まれている
- ディレクトリリスティングが有効になっている

A06: 脆弱で古いコンポーネント

既知の脆弱性を持つライブラリやフレームワークを使い続ける問題です。

bash
# npm audit で脆弱性をチェック
$ npm audit
found 3 vulnerabilities (1 moderate, 2 high)

# 脆弱性の詳細を確認
$ npm audit --json

A07: 識別と認証の失敗

認証メカニズムが不十分な問題です。

よくある問題:
- 弱いパスワードを許可している
- ブルートフォース攻撃への対策がない
- セッションIDが予測可能
- ログアウト後もセッションが有効

A08: ソフトウェアとデータの整合性の不備

ソフトウェアの更新やデータの処理で整合性の検証がない問題です。

例:
- 署名なしのアップデート配布
- 信頼できないソースからのデシリアライゼーション
- CI/CDパイプラインの改ざん

A09: セキュリティログと監視の不備

攻撃を検知・記録・対応できない問題です。

問題:
- ログインの失敗を記録していない
- ログが監視されていない
- アラートの仕組みがない
- インシデント対応計画がない

A10: SSRF(サーバーサイドリクエストフォージェリ)

サーバーに内部リソースへのリクエストを実行させる攻撃です。

typescript
// 脆弱な例: ユーザー入力のURLにそのままリクエスト
app.get('/api/fetch', async (req, res) => {
  const url = req.query.url;
  const response = await fetch(url); // 内部ネットワークにアクセスされる可能性
  res.json(await response.json());
});

実務での活用方法

OWASP Top 10をチェックリストとして使う

開発フェーズ        チェック内容
──────────────────────────────────────
設計時     → A04: 脅威モデリングを実施したか?
実装時     → A01, A03: アクセス制御とインジェクション対策は?
レビュー時  → A02, A07: 暗号化と認証の実装は適切か?
テスト時    → A05, A06: 設定ミスと古いライブラリはないか?
運用時     → A09: ログと監視の体制は整っているか?

まとめ

ポイント内容
OWASPとはWebセキュリティのオープンコミュニティ
Top 10の目的最も重大なリスクを優先順位付きで提示
今月の焦点A03(インジェクション)を中心に、A01、A02、A07も学ぶ
活用方法設計・実装・レビュー・テスト・運用の各段階でチェック

チェックリスト

  • OWASPの目的を理解した
  • Top 10の各カテゴリの概要を把握した
  • インジェクション攻撃がTop 10に含まれる理由を理解した
  • 実務での活用イメージを持てた

次のステップへ

OWASP Top 10の全体像をつかみました。 次のセクションでは、今月の中心テーマであるSQLインジェクションの仕組みを詳しく学びます。

攻撃者がどのようにデータベースを操作するのか、その手口を知りましょう。


推定読了時間: 30分