owasp-security
コードのセキュリティ脆弱性を検査したり、認証・認可機能を実装したり、ユーザー入力を処理したり、Webアプリケーションのセキュリティについて検討する場合に使用します。OWASP Top 10:2025、ASVS 5.0、Agentic AIセキュリティ(2026)に対応しています。
description の原文を見る
Use when reviewing code for security vulnerabilities, implementing authentication/authorization, handling user input, or discussing web application security. Covers OWASP Top 10:2025, ASVS 5.0, and Agentic AI security (2026).
SKILL.md 本文
OWASPセキュリティベストプラクティススキル
コードの作成またはレビュー時にこれらのセキュリティ基準を適用してください。
クイックリファレンス: OWASP Top 10:2025
| # | 脆弱性 | 主な対策 |
|---|---|---|
| A01 | アクセス制御の不適切な実装 | デフォルト拒否、サーバー側での検証、所有権確認 |
| A02 | セキュリティ設定の誤り | 設定の強化、デフォルト無効化、機能最小化 |
| A03 | サプライチェーンの失敗 | バージョンロック、整合性検証、依存関係監査 |
| A04 | 暗号化の失敗 | TLS 1.2以上、AES-256-GCM、パスワードはArgon2/bcrypt |
| A05 | インジェクション | パラメータ化クエリ、入力検証、安全なAPI |
| A06 | 不安全な設計 | 脅威モデリング、レート制限、セキュリティ制御の設計 |
| A07 | 認証の失敗 | MFA、漏洩パスワードチェック、セキュアセッション |
| A08 | 整合性の失敗 | パッケージへの署名、CDNのSRI、安全なシリアライズ |
| A09 | ロギングの失敗 | セキュリティイベントログ、構造化形式、アラート |
| A10 | 例外処理の不適切な実装 | 閉鎖に失敗、内部情報非開示、コンテキスト付きログ |
セキュリティコードレビューチェックリスト
コードレビュー時に以下の問題をチェックしてください:
入力処理
- すべてのユーザー入力がサーバー側で検証されている
- パラメータ化クエリを使用している(文字列連結ではない)
- 入力長制限が実装されている
- ホワイトリスト検証がブラックリスト検証より優先されている
認証とセッション
- パスワードがArgon2/bcryptでハッシュ化されている(MD5/SHA1ではない)
- セッショントークンが十分なエントロピーを持っている(128ビット以上)
- ログアウト時にセッションが無効化されている
- 機密操作にMFAが利用可能である
アクセス制御
- すべてのリクエストで認可チェックが実施されている
- ユーザーが操作できないオブジェクト参照を使用している
- デフォルト拒否ポリシーが実装されている
- 権限昇格パスがレビューされている
データ保護
- 機密データが保存時に暗号化されている
- すべてのデータ転送にTLSを使用している
- 機密データがURLやログに含まれていない
- シークレットが環境/ボルトに格納されている(コードではない)
エラー処理
- スタックトレースがユーザーに露出していない
- エラー時に閉鎖に失敗している(許可ではなく拒否)
- すべての例外がコンテキスト付きでログされている
- エラー応答が一貫している(列挙不可)
セキュアコードパターン
SQLインジェクション対策
# 危険
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
# 安全
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
コマンドインジェクション対策
# 危険
os.system(f"convert {filename} output.png")
# 安全
subprocess.run(["convert", filename, "output.png"], shell=False)
パスワード保存
# 危険
hashlib.md5(password.encode()).hexdigest()
# 安全
from argon2 import PasswordHasher
PasswordHasher().hash(password)
アクセス制御
# 危険 - 認可チェックなし
@app.route('/api/user/<user_id>')
def get_user(user_id):
return db.get_user(user_id)
# 安全 - 認可の実装
@app.route('/api/user/<user_id>')
@login_required
def get_user(user_id):
if current_user.id != user_id and not current_user.is_admin:
abort(403)
return db.get_user(user_id)
エラー処理
# 危険 - 内部情報を露出
@app.errorhandler(Exception)
def handle_error(e):
return str(e), 500
# 安全 - 閉鎖に失敗、コンテキストをログ
@app.errorhandler(Exception)
def handle_error(e):
error_id = uuid.uuid4()
logger.exception(f"Error {error_id}: {e}")
return {"error": "An error occurred", "id": str(error_id)}, 500
閉鎖に失敗するパターン
# 危険 - 開放に失敗
def check_permission(user, resource):
try:
return auth_service.check(user, resource)
except Exception:
return True # 危険!
# 安全 - 閉鎖に失敗
def check_permission(user, resource):
try:
return auth_service.check(user, resource)
except Exception as e:
logger.error(f"Auth check failed: {e}")
return False # エラー時に拒否
エージェンティックAIセキュリティ(OWASP 2026)
AIエージェントシステムを構築またはレビューする場合、以下をチェックしてください:
| リスク | 説明 | 対策 |
|---|---|---|
| ASI01: ゴール乗っ取り | プロンプトインジェクションがエージェント目標を変更 | 入力サニタイズ、ゴール境界、動作監視 |
| ASI02: ツール悪用 | ツールが意図しない方法で使用される | 最小権限、細粒度権限、I/O検証 |
| ASI03: 権限悪用 | エージェント間での認証情報昇格 | 短寿命スコープトークン、ID検証 |
| ASI04: サプライチェーン | 危険にさらされたプラグイン/MCPサーバー | 署名検証、サンドボックス、プラグインホワイトリスト |
| ASI05: コード実行 | 安全でないコード生成/実行 | サンドボックス実行、静的解析、人間の承認 |
| ASI06: メモリ汚染 | 破損したRAG/コンテキストデータ | 保存コンテンツ検証、信頼レベルでセグメント化 |
| ASI07: エージェント通信 | エージェント間なりすまし | 認証、暗号化、メッセージ整合性検証 |
| ASI08: カスケード障害 | システム全体にエラーが波及 | サーキットブレーカー、段階的劣化、隔離 |
| ASI09: 信頼悪用 | AIを使用したソーシャルエンジニアリング | AIコンテンツラベル、ユーザー教育、検証ステップ |
| ASI10: ローグエージェント | 悪意のある危険にさらされたエージェント | 動作監視、キルスイッチ、異常検知 |
エージェントセキュリティチェックリスト
- すべてのエージェント入力がサニタイズおよび検証されている
- ツールが必要最小限の権限で動作している
- 認証情報が短寿命かつスコープされている
- サードパーティプラグインが検証およびサンドボックス化されている
- コード実行が隔離された環境で行われている
- エージェント通信が認証および暗号化されている
- エージェントコンポーネント間にサーキットブレーカーがある
- 機密操作に人間の承認がある
- 異常検知のための動作監視がある
- エージェントシステムにキルスイッチがある
ASVS 5.0主要要件
レベル1(すべてのアプリケーション)
- パスワード最小12文字
- 漏洩パスワードリストに対するチェック
- 認証時のレート制限
- セッショントークン128ビット以上のエントロピー
- 完全なHTTPS
レベル2(機密データ)
- すべてのレベル1要件に加えて:
- 機密操作にMFA
- 暗号化鍵の管理
- 包括的なセキュリティログ
- すべてのパラメータへの入力検証
レベル3(クリティカルシステム)
- すべてのレベル1/2要件に加えて:
- 鍵用ハードウェアセキュリティモジュール
- 脅威モデリングドキュメント
- 高度な監視およびアラート
- ペネトレーションテスト検証
言語固有のセキュリティ注意点
重要: 以下の例は説明目的の開始点であり、網羅的ではありません。コードレビュー時には、シニアセキュリティ研究者のように考えてください。言語のメモリモデル、型システム、標準ライブラリの落とし穴、エコシステム固有の攻撃ベクトル、および履歴的なCVEパターンを考慮してください。各言語はここにリストされているもの以上の深い特性を持っています。
異なる言語は固有のセキュリティの落とし穴を持っています。以下は主な20の言語とその主要なセキュリティに関する考慮事項です。使用している特定の言語についてさらに深く調べてください:
JavaScript / TypeScript
主なリスク: プロトタイプ汚染、XSS、eval インジェクション
// 危険: プロトタイプ汚染
Object.assign(target, userInput)
// 安全: null プロトタイプを使用または キーを検証
Object.assign(Object.create(null), validated)
// 危険: eval インジェクション
eval(userCode)
// 安全: ユーザー入力で eval を使用しない
注意: eval()、innerHTML、document.write()、プロトタイプチェーン操作、__proto__
Python
主なリスク: Pickleデシリアライゼーション、フォーマット文字列インジェクション、シェルインジェクション
# 危険: Pickle RCE
pickle.loads(user_data)
# 安全: JSONを使用またはソースを検証
json.loads(user_data)
# 危険: フォーマット文字列インジェクション
query = "SELECT * FROM users WHERE name = '%s'" % user_input
# 安全: パラメータ化
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
注意: pickle、eval()、exec()、os.system()、subprocess で shell=True
Java
主なリスク: デシリアライゼーション RCE、XXE、JNDI インジェクション
// 危険: 任意のデシリアライゼーション
ObjectInputStream ois = new ObjectInputStream(userStream);
Object obj = ois.readObject();
// 安全: ホワイトリストまたはJSONを使用
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, SafeClass.class);
注意: ObjectInputStream、Runtime.exec()、XXE保護なしのXMLパーサー、JNDIルックアップ
C#
主なリスク: デシリアライゼーション、SQLインジェクション、パストラバーサル
// 危険: BinaryFormatter RCE
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(stream);
// 安全: System.Text.Json を使用
var obj = JsonSerializer.Deserialize<SafeType>(json);
注意: BinaryFormatter、JavaScriptSerializer、TypeNameHandling.All、生のSQLストリング
PHP
主なリスク: 型の曖昧性、ファイルインクルージョン、オブジェクトインジェクション
// 危険: 認証における型の曖昧性
if ($password == $stored_hash) { ... }
// 安全: 厳密比較を使用
if (hash_equals($stored_hash, $password)) { ... }
// 危険: ファイルインクルージョン
include($_GET['page'] . '.php');
// 安全: ホワイトリストページ
$allowed = ['home', 'about']; include(in_array($page, $allowed) ? "$page.php" : 'home.php');
注意: == vs ===、include/require、unserialize()、preg_replace with /e、extract()
Go
主なリスク: データ競合、テンプレートインジェクション、スライス境界
// 危険: データ競合
go func() { counter++ }()
// 安全: sync プリミティブを使用
atomic.AddInt64(&counter, 1)
// 危険: テンプレートインジェクション
template.HTML(userInput)
// 安全: テンプレートにエスケープさせる
{{.UserInput}}
注意: ゴルーチンのデータ競合、template.HTML()、unsafe パッケージ、チェックされていないスライスアクセス
Ruby
主なリスク: マスアサインメント、YAML デシリアライゼーション、正規表現DoS
# 危険: マスアサインメント
User.new(params[:user])
# 安全: ストロングパラメータ
User.new(params.require(:user).permit(:name, :email))
# 危険: YAML RCE
YAML.load(user_input)
# 安全: safe_load を使用
YAML.safe_load(user_input)
注意: YAML.load、Marshal.load、eval、ユーザー入力による send、.permit!
Rust
主なリスク: unsafe ブロック、FFI 境界問題、リリースでの整数オーバーフロー
// 注意: Unsafe は安全性をバイパス
unsafe { ptr::read(user_ptr) }
// 注意: リリース整数オーバーフロー
let x: u8 = 255;
let y = x + 1; // リリースで 0 にラップ!
// 安全: チェック済み算術を使用
let y = x.checked_add(1).unwrap_or(255);
注意: unsafe ブロック、FFI呼び出し、リリースビルドでの整数オーバーフロー、信頼できない入力に対する .unwrap()
Swift
主なリスク: force unwrap クラッシュ、Objective-C相互運用
// 危険: 信頼できないデータに force unwrap
let value = jsonDict["key"]!
// 安全: safe unwrapping
guard let value = jsonDict["key"] else { return }
// 危険: フォーマット文字列
String(format: userInput, args)
// 安全: ユーザー入力をフォーマットとして使用しない
注意: force unwrap (!)、try!、ObjC ブリッジング、NSSecureCoding の誤用
Kotlin
主なリスク: null安全性のバイパス、Java相互運用、シリアライゼーション
// 危険: Javaからのプラットフォーム型
val len = javaString.length // null なら NPE
// 安全: 明示的な null チェック
val len = javaString?.length ?: 0
// 危険: リフレクション
clazz.getDeclaredMethod(userInput)
// 安全: メソッドをホワイトリスト
注意: Java相互運用 nulls (! オペレータ)、リフレクション、シリアライゼーション、プラットフォーム型
C / C++
主なリスク: バッファオーバーフロー、use-after-free、フォーマット文字列
// 危険: バッファオーバーフロー
char buf[10]; strcpy(buf, userInput);
// 安全: 境界チェック
strncpy(buf, userInput, sizeof(buf) - 1);
// 危険: フォーマット文字列
printf(userInput);
// 安全: 常にフォーマット指定子を使用
printf("%s", userInput);
注意: strcpy、sprintf、gets、ポインタ演算、手動メモリ管理、整数オーバーフロー
Scala
主なリスク: XML外部エンティティ、シリアライゼーション、パターンマッチングの網羅性
// 危険: XXE
val xml = XML.loadString(userInput)
// 安全: 外部エンティティを無効化
val factory = SAXParserFactory.newInstance()
factory.setFeature("http://xml.org/sax/features/external-general-entities", false)
注意: Java相互運用問題、XML解析、Serializable、包括的パターンマッチング
R
主なリスク: コードインジェクション、ファイルパス操作
# 危険: eval インジェクション
eval(parse(text = user_input))
# 安全: ユーザー入力をコードとして解析しない
# 危険: パストラバーサル
read.csv(paste0("data/", user_file))
# 安全: ファイル名を検証
if (grepl("^[a-zA-Z0-9]+\\.csv$", user_file)) read.csv(...)
注意: eval()、parse()、source()、system()、ファイルパス操作
Perl
主なリスク: 正規表現インジェクション、open() インジェクション、taint モードのバイパス
# 危険: 正規表現 DoS
$input =~ /$user_pattern/;
# 安全: quotemeta を使用
$input =~ /\Q$user_pattern\E/;
# 危険: open() コマンドインジェクション
open(FILE, $user_file);
# 安全: 3引数 open
open(my $fh, '<', $user_file);
注意: 2引数 open()、ユーザー入力からの正規表現、バッククォート、eval、無効化された taint モード
シェル(Bash)
主なリスク: コマンドインジェクション、ワード分割、グロビング
# 危険: クォートされていない変数
rm $user_file
# 安全: 常にクォート
rm "$user_file"
# 危険: eval
eval "$user_command"
# 安全: ユーザー入力を eval しない
注意: クォートされていない変数、eval、バッククォート、$(...) ユーザー入力での使用、set -euo pipefail の不足
Lua
主なリスク: サンドボックスエスケープ、loadstring インジェクション
-- 危険: コードインジェクション
loadstring(user_code)()
-- 安全: 制限された関数を持つサンドボックス環境を使用
注意: loadstring、loadfile、dofile、os.execute、io ライブラリ、debug ライブラリ
Elixir
主なリスク: アトム枯渇、コードインジェクション、ETS アクセス
# 危険: アトム枯渇 DoS
String.to_atom(user_input)
# 安全: 既存のアトムのみを使用
String.to_existing_atom(user_input)
# 危険: コードインジェクション
Code.eval_string(user_input)
# 安全: ユーザー入力を eval しない
注意: String.to_atom、Code.eval_string、:erlang.binary_to_term、ETS パブリックテーブル
Dart / Flutter
主なリスク: プラットフォームチャネルインジェクション、安全でないストレージ
// 危険: SharedPreferences にシークレットを保存
prefs.setString('auth_token', token);
// 安全: flutter_secure_storage を使用
secureStorage.write(key: 'auth_token', value: token);
注意: プラットフォームチャネルデータ、dart:mirrors、Function.apply、安全でないローカルストレージ
PowerShell
主なリスク: コマンドインジェクション、実行ポリシーのバイパス
# 危険: インジェクション
Invoke-Expression $userInput
# 安全: ユーザーデータで Invoke-Expression を避ける
# 危険: 検証されていないパス
Get-Content $userPath
# 安全: パスが許可されたディレクトリ内にあることを検証
注意: Invoke-Expression、& $userVar、Start-Process ユーザー args での使用、-ExecutionPolicy Bypass
SQL(すべてのダイアレクト)
主なリスク: インジェクション、権限昇格、データ流出
-- 危険: 文字列連結
"SELECT * FROM users WHERE id = " + userId
-- 安全: パラメータ化クエリ(言語固有)
-- すべてのケースでプリペアドステートメントを使用
注意: 動的SQL、EXECUTE IMMEDIATE、動的クエリを含むストアドプロシージャ、権限付与
深いセキュリティ分析のマインドセット
任意の言語をレビューする際、シニアセキュリティ研究者のように考えてください:
- メモリモデル: 言語はメモリをどのように処理しますか?管理型vs手動型?GC一時停止は悪用可能ですか?
- 型システム: 弱い型付け=型混同攻撃。型強制の悪用を探してください。
- シリアライゼーション: すべての言語には同等の pickle/Marshal があります。すべて危険です。
- 並行処理: データ競合、TOCTOU、スレッドモデル固有のアトミック性の失敗。
- FFI境界: ネイティブ相互運用は型安全性が崩れる場所です。
- 標準ライブラリ: 標準ライブラリの履歴的CVE(Python urllib、Java XML、Ruby OpenSSL)。
- パッケージエコシステム: タイポスクワッティング、依存関係混同、悪意のあるパッケージ。
- ビルドシステム: ビルド中のMakefile/gradle/npm スクリプトインジェクション。
- ランタイム動作: デバッグ vs リリース違い(Rust オーバーフロー、C++ アサーション)。
- エラー処理: 言語はどのように失敗しますか?サイレント?スタックトレースで?開放に失敗?
リストされていない言語の場合: その言語の特定のCWEパターン、CVE履歴、既知の落とし穴を調査してください。上記の例は開始点であり、完全なカバレッジではありません。
このスキルを適用する時機
以下の場合にこのスキルを使用してください:
- 認証または認可コードの作成
- ユーザー入力または外部データの処理
- 暗号化またはパスワード保存の実装
- セキュリティ脆弱性のコードレビュー
- APIエンドポイントの設計
- AIエージェントシステムの構築
- アプリケーションセキュリティ設定の構成
- エラーと例外の処理
- サードパーティ依存関係の操作
- 任意の言語での作業 - 上記の深い分析マインドセットを適用してください
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- georgekhananaev
- ライセンス
- MIT
- 最終更新
- 2026/5/9
Source: https://github.com/georgekhananaev/claude-skills-vault / ライセンス: MIT