owasp について
owaspは、開発者やコードレビュー担当者向けのセキュリティ参照スキルです。OWASP Top 10(2021)に沿って、脆弱性の例や対策、トラブルシューティングをまとめています。
主な機能
- 01OWASP Top 10(2021)の参照
- 02一般的なセキュリティ対策例
- 03コードレビューのアンチパターン
- 04トラブルシューティング情報
活用シーン
- 01アクセス制御やインジェクションのリスクをコードレビュー
- 02パスワードやログインの保護を強化
- 03セキュリティ設定とログ処理を確認
MCP 対応
READMEでは、詳細なOWASPドキュメントの取得にmcp__documentation__fetch_docsを利用できると説明されています。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill owaspインストール後、Claude Code で/owaspを入力して読み込まれたか確認します。
詳細
OWASP セキュリティ - クイックリファレンス
このスキルを使用する場面
- よくある脆弱性を特定する
- セキュリティ制御を実装する
- セキュリティ上の問題についてコードレビューを行う
このスキルを使用しない場面
- OWASP Top 10:2025 - 最新の2025年の基準については、
owasp-top-10スキルを使用してください - シークレット管理 - 認証情報の取り扱いについては、
secrets-managementスキルを使用してください - サプライチェーンセキュリティ - 依存関係の問題については、
supply-chainスキルを使用してください - JWT/OAuth セキュリティ - プロトコル固有の問題については、認証スキルを使用してください
詳細な知識:包括的なドキュメントについては、technology に
owaspを指定してmcp__documentation__fetch_docsを使用してください。
OWASP Top 10(2021年)
A01:アクセス制御の不備
// BAD - Direct object reference
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userRepository.findById(id);
}
// GOOD - Check authorization
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id, Authentication auth) {
User user = userRepository.findById(id);
if (!user.getId().equals(auth.getPrincipal().getId())) {
throw new AccessDeniedException("Not authorized");
}
return user;
}
A02:暗号化の失敗
// BAD - Weak hashing
String hash = DigestUtils.md5Hex(password);
// GOOD - Strong hashing with salt
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String hash = encoder.encode(password);
A03:インジェクション
// BAD - SQL Injection
String query = "SELECT * FROM users WHERE name = '" + name + "'";
// GOOD - Parameterized query
@Query("SELECT u FROM User u WHERE u.name = :name")
User findByName(@Param("name") String name);
A04:安全でない設計
- 設計段階での脅威モデリング
- ユーザーストーリーにおけるセキュリティ要件
- 多層防御アーキテクチャ
A05:セキュリティ設定ミス
# Spring Security - disable defaults carefully
spring:
security:
headers:
content-security-policy: "default-src 'self'"
x-frame-options: DENY
x-content-type-options: nosniff
A06:脆弱なコンポーネント
# Check for vulnerabilities
npm audit
mvn dependency-check:check
pip-audit
A07:認証の失敗
// Implement rate limiting
@RateLimiter(name = "login", fallbackMethod = "loginFallback")
public AuthResponse login(LoginRequest request) {
// ...
}
// Account lockout
if (failedAttempts >= 5) {
lockAccount(user);
}
A08:ソフトウェアの完全性
- 依存関係の署名を検証する
- ロックファイル(package-lock.json、pom.xml)を使用する
- CI/CD パイプラインのセキュリティ
A09:ログ記録の失敗
// Log security events
log.info("Login attempt", Map.of(
"user", username,
"ip", request.getRemoteAddr(),
"success", authenticated
));
// DON'T log sensitive data
log.info("Password: {}", password); // NEVER!
A10:SSRF
// Validate URLs
private boolean isAllowedUrl(String url) {
URL parsed = new URL(url);
return allowedHosts.contains(parsed.getHost());
}
セキュリティヘッダー
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
return http
.headers(headers -> headers
.contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'"))
.frameOptions(frame -> frame.deny())
.xssProtection(xss -> xss.disable())
)
.build();
}
}
アンチパターン
| アンチパターン | 問題点 | 正しいアプローチ |
|---|---|---|
| 認証なしの直接オブジェクト参照 | IDOR の脆弱性(A01) | アクセス前に必ず所有権を確認する |
| パスワードに MD5/SHA1 を使用する | 簡単に解読される | ソルト付きの bcrypt/argon2 を使用する |
| SQL での文字列連結 | SQL インジェクション | パラメーター化クエリ/ORM を使用する |
| 本番環境でスタックトレースを公開する | 情報漏えい | 汎用的なエラーメッセージのみを表示する |
| ログイン時にレート制限がない | ブルートフォース攻撃 | レート制限とアカウントロックアウトを実装する |
| コードにシークレットを保存する | 認証情報の漏えい | 環境変数/ボールトを使用する |
簡単なトラブルシューティング
| 問題 | 考えられる原因 | 解決策 |
|---|---|---|
| 有効なリクエストで 403 Forbidden が発生する | CORS の設定ミス | CORS 設定で許可されたオリジンを確認する |
| セッションが保持されない | SameSite Cookie の問題 | HTTPS を使用して SameSite=Lax または None を設定する |
| JWT トークンが拒否される | クロックスキューまたは期限切れ | クロックスキューの許容範囲(5min)を設定する |
| ファイルのアップロードに失敗する | CSP によるブロック | CSP ディレクティブにアップロードドメインを追加する |
| API が予期せず 401 を返す | Authorization ヘッダーがない、または無効 | Bearer トークンの形式を確認する |
コメント
Markdown 対応