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 --jsonA07: 識別と認証の失敗
認証メカニズムが不十分な問題です。
よくある問題:
- 弱いパスワードを許可している
- ブルートフォース攻撃への対策がない
- セッション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分