LESSON 30分

ストーリー

佐藤CTOがセキュリティインシデントの報告書を手に、あなたをミーティングルームに呼びました。

佐藤CTO
先月、同業他社がサプライチェーン攻撃を受けて3日間サービスが停止した。うちも他人事じゃない
あなた
サプライチェーン攻撃…依存ライブラリ経由の攻撃ですか?
佐藤CTO
そうだ。npm パッケージに悪意のあるコードが仕込まれていた。境界防御だけでは防げない。全てを疑え — それがセキュリティの新常識だ
佐藤CTO
Zero Trust
佐藤CTO
今月は組織全体のセキュリティを強化する。開発速度を落とさずにセキュリティレベルを上げる方法を、一緒に探ろう

OWASP Top 10 — 最も警戒すべきWebアプリケーションの脅威

OWASP(Open Worldwide Application Security Project)は、Webアプリケーションのセキュリティリスクを定期的にランキングしています。

OWASP Top 10 (2021)

順位カテゴリ概要影響度
A01アクセス制御の不備認可チェックの欠如、権限昇格極めて高い
A02暗号化の失敗機密データの平文保存、弱い暗号化高い
A03インジェクションSQL/NoSQL/OS/LDAPインジェクション、XSS高い
A04安全でない設計設計段階でのセキュリティ考慮不足高い
A05セキュリティの設定ミスデフォルト設定の放置、不要な機能の有効化中〜高い
A06脆弱なコンポーネント既知の脆弱性を持つライブラリの使用中〜高い
A07認証の不備セッション管理の欠陥、弱いパスワードポリシー高い
A08ソフトウェアとデータの整合性の不備CI/CDパイプラインの保護不足中〜高い
A09セキュリティログと監視の不備侵入検知の遅れ、ログ不足
A10SSRF(サーバーサイドリクエストフォージェリ)内部リソースへの不正アクセス中〜高い
// A01: アクセス制御の不備 -- 脆弱なコード例
app.get('/api/users/:id/profile', async (req, res) => {
  // 危険: 認可チェックなし -- 誰でも他人のプロフィールを取得できる
  const user = await userRepository.findById(req.params.id);
  res.json(user);
});

// 修正版: 認可チェックを追加
app.get('/api/users/:id/profile', authenticate, async (req, res) => {
  const requestedUserId = req.params.id;
  const currentUserId = req.user.id;

  // 自分自身または管理者のみアクセス可能
  if (requestedUserId !== currentUserId && !req.user.roles.includes('admin')) {
    return res.status(403).json({ error: 'Forbidden' });
  }

  const user = await userRepository.findById(requestedUserId);
  res.json(user);
});

最新の攻撃トレンド

サプライチェーン攻撃

サプライチェーン攻撃は、ソフトウェアの依存関係やビルドプロセスを狙った攻撃です。

攻撃手法説明実例
依存関係の汚染正規パッケージに悪意のあるコードを注入event-stream事件(2018)
タイポスクワッティング類似名のパッケージで開発者を騙すcrossenv → cross-env
アカウント乗っ取りメンテナのアカウントを奪取してパッケージを改ざんua-parser-js事件(2021)
ビルドパイプラインの侵害CI/CDシステムを攻撃してビルド成果物を改ざんSolarWinds事件(2020)
依存関係の混同内部パッケージと同名の公開パッケージを登録Dependency Confusion攻撃
// package.json の依存関係を検証するスクリプト例
import { execSync } from 'child_process';
import * as fs from 'fs';

interface AuditResult {
  vulnerabilities: {
    [severity: string]: number;
  };
}

function checkDependencySecurity(): void {
  // npm audit で脆弱性をチェック
  const auditOutput = execSync('npm audit --json', { encoding: 'utf-8' });
  const audit: AuditResult = JSON.parse(auditOutput);

  const criticalCount = audit.vulnerabilities['critical'] ?? 0;
  const highCount = audit.vulnerabilities['high'] ?? 0;

  if (criticalCount > 0 || highCount > 0) {
    console.error(`重大な脆弱性が検出されました: Critical=${criticalCount}, High=${highCount}`);
    process.exit(1);
  }

  console.log('依存関係のセキュリティチェック: OK');
}

ゼロデイ脆弱性

ゼロデイ脆弱性は、ベンダーやセキュリティコミュニティが認識する前に悪用される脆弱性です。

特徴説明
発見から悪用までの時間パッチ提供前に攻撃が発生(0日間の猶予)
検出の困難さシグネチャベースの検知では防げない
対策多層防御、振る舞い検知、最小権限の原則
最近の傾向Log4Shell(2021)、Spring4Shell(2022)などフレームワークの脆弱性が増加

ランサムウェアとデータ漏洩

攻撃段階手法対策
初期侵入フィッシング、VPN脆弱性MFA、セキュリティ教育
横展開権限昇格、ラテラルムーブメントマイクロセグメンテーション
データ持ち出し機密データの暗号化・外部送信DLP、ネットワーク監視
ランサム要求データ暗号化・公開脅迫バックアップ、インシデント対応計画

脅威ランドスケープの全体像

graph TD
    Title["脅威ランドスケープ"]
    Title --- External["外部脅威<br/>・標的型攻撃<br/>・DDoS攻撃<br/>・フィッシング<br/>・ランサムウェア<br/>・ゼロデイ"]
    Title --- Internal["内部脅威<br/>・内部不正<br/>・設定ミス<br/>・権限の乱用<br/>・シャドーIT<br/>・退職者リスク"]
    Title --- Supply["サプライチェーン脅威<br/>・依存ライブラリの脆弱性<br/>・ビルドパイプラインの侵害<br/>・サードパーティサービスの侵害<br/>・OSS汚染<br/>・コンテナイメージの改ざん"]

    classDef title fill:#1a1a2e,stroke:#e94560,color:#fff
    classDef external fill:#e94560,stroke:#e94560,color:#fff
    classDef internal fill:#f5a623,stroke:#f5a623,color:#fff
    classDef supply fill:#0f3460,stroke:#0f3460,color:#fff

    class Title title
    class External external
    class Internal internal
    class Supply supply

脅威アクターの分類

アクター動機能力典型的な攻撃
スクリプトキディ自己顕示、いたずら低い既知の脆弱性を悪用
サイバー犯罪グループ金銭的利益中〜高いランサムウェア、フィッシング
内部犯行者不満、金銭内部知識データ漏洩、サボタージュ
国家支援型情報収集、破壊極めて高いAPT、ゼロデイ
ハクティビスト政治的・社会的主張中程度DDoS、データ公開

セキュリティの基本原則:CIA + AAA

CIAトライアド

原則英語説明脅威例
機密性Confidentiality認可されたユーザーだけがデータにアクセスできるデータ漏洩、盗聴
完全性Integrityデータが不正に改ざんされていないことを保証データ改ざん、MITM攻撃
可用性Availability必要なときにシステムとデータが利用できるDDoS攻撃、ランサムウェア

AAA(認証・認可・監査)

原則英語説明
認証Authentication「あなたは誰ですか?」の検証
認可Authorization「あなたは何ができますか?」の制御
監査Accounting/Auditing「あなたは何をしましたか?」の記録
// CIA + AAA を意識したAPIミドルウェアの例
import { Request, Response, NextFunction } from 'express';

// 認証(Authentication): JWTトークンの検証
function authenticate(req: Request, res: Response, next: NextFunction): void {
  const token = req.headers.authorization?.replace('Bearer ', '');
  if (!token) {
    res.status(401).json({ error: 'Authentication required' });
    return;
  }
  try {
    req.user = verifyJwt(token);
    next();
  } catch {
    res.status(401).json({ error: 'Invalid token' });
  }
}

// 認可(Authorization): ロールベースのアクセス制御
function authorize(...requiredRoles: string[]) {
  return (req: Request, res: Response, next: NextFunction): void => {
    const userRoles = req.user?.roles ?? [];
    const hasRole = requiredRoles.some(role => userRoles.includes(role));
    if (!hasRole) {
      res.status(403).json({ error: 'Insufficient permissions' });
      return;
    }
    next();
  };
}

// 監査(Auditing): アクセスログの記録
function audit(req: Request, res: Response, next: NextFunction): void {
  const logEntry = {
    timestamp: new Date().toISOString(),
    userId: req.user?.id ?? 'anonymous',
    method: req.method,
    path: req.path,
    ip: req.ip,
    userAgent: req.headers['user-agent'],
  };
  securityLogger.info('API_ACCESS', logEntry);
  next();
}

まとめ

ポイント内容
OWASP Top 10Webアプリケーションの最も深刻な10のセキュリティリスク
サプライチェーン攻撃依存関係やビルドプロセスを狙った攻撃が急増
ゼロデイ脆弱性パッチ提供前に悪用される脆弱性、多層防御が重要
CIAトライアド機密性・完全性・可用性がセキュリティの三本柱
AAA認証・認可・監査を組み合わせてアクセスを制御

チェックリスト

  • OWASP Top 10の各カテゴリを理解した
  • サプライチェーン攻撃の手法と対策を把握した
  • ゼロデイ脆弱性の特徴と多層防御の重要性を理解した
  • CIAトライアドとAAAの概念を説明できる
  • 脅威アクターの分類と各アクターの特徴を理解した

次のステップへ

次は「脅威モデリング(STRIDE)」を学びます。脅威を体系的に分析するためのフレームワークを使い、システムの弱点を事前に特定する方法を身につけましょう。


推定読了時間: 30分