参考ライブラリのソースをローカルで検索できる形に整え、実装前に必要なコードを取り出すスキルです。不慣れなAPIの仕様確認やアルゴリズム移植を支援します。
- 不慣れなAPIの動作を確認したいとき
- 参考実装からのアルゴリズム移植
- 同じエラーで試行が続くとき
PHPなどのコードから危険な関数の呼び出しを列挙し、抽出漏れを照合するスキルです。入力経路や防御策を調べ、危険度と判定を検索可能な監査台帳にまとめます。
Coverage-guaranteed whitebox security audit of a codebase using XERJ + tree-sitter AST. Use when the user wants to security-review PHP (or other-language) code with a provable "we enumerated every dangerous call" guarantee, or asks to run the WordPress-style sink census / audit. Drives an index-once, query-read-reason loop; proves zero gaps against grep; enriches findings into a queryable ledger.
PHPなどのソースコードを調べ、既知の危険な関数の呼び出し箇所を列挙します。tree-sitterでコードの構造を解析し、grepの出現箇所と照合して抽出漏れを確認します。結果をXERJに登録し、外部入力から到達するか、防御策があるか、危険度はどの程度かを判定して、検索可能な監査台帳に残します。
PHPアプリやWordPressプラグインを監査し、調べた範囲を明確に説明したいときに向いています。関数の列挙に加え、認可の不備や入力検証の不足、危険な処理へ至る呼び出し経路を確認する手順も含みます。
稼働中のXERJ、対象ソース、tree-sitterと対象言語の文法、付属の監査スクリプトが必要です。漏れの確認は登録済みの危険な関数が対象で、脆弱性全体の網羅を保証するものではありません。経路分析の候補は、コードの読解と実行で検証します。
この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Run a security review where XERJ is the agent's second brain: index the code
once, then interrogate it — never load whole files. The deliverable is a
defensible coverage claim, not a vibe. Scripts referenced below live in
docs/case-studies/wordpress-security-audit/sink-census/ (copy them alongside
this skill to reuse in another repo).
http://127.0.0.1:9200 (xerj --insecure --data-dir ./data).pip install tree-sitter tree-sitter-php (+ the grammar for the target language).Use php_dangerous_functions.json — 275 PHP built-ins/constructs across 28
categories (command/code exec, unserialize, include loaders, file r/w/delete,
SSRF, SQL drivers, XXE, callables, variable-injection, reflection, weak crypto/
random, type-juggling, …), each with vuln class + the taint-relevant argument.
For another framework/language, extend this map — it is data, not code.
python3 sink_census.py <src> parses every file with tree-sitter and records
python3 pattern_census.py <src> AST-detects the non-function vulns — loose ==
/ magic-hash, non-strict in_array, strcmp-with-array (?login[]=), @
suppression, variable-variables, unsafe setcookie, switch-on-request,
Host-header trust, ORDER-BY injection — into wppatterns. Semantic classes a
census can't decide (SQL truncation, charset SQLi, second-order, phar, TOCTOU,
upload-exec, is_numeric bypass, regex-anchor, session-fixation, wrong-context
XSS) are catalogued in php_dangerous_patterns.json with detection guidance and
swept by reasoning. FULL REFERENCE: PHP-SECURITY-GUIDE.md — every function AND
pattern mapped to attack + detection + safe recipe.
every call site of a catalogued function (calls, methods, constructs like
echo/include/backtick, new ReflectionFunction). tree-sitter captures real
calls regardless of formatting/namespacing — grep cannot.
The census reconciles every grep occurrence against the AST, using AST string/comment/inline-HTML node ranges as the oracle. A clean run prints:
UNEXPLAINED: 0 => coverage PROVEN (0 gaps)
If UNEXPLAINED > 0, EVERY residual must be resolved (it is either a real call the extractor missed — fix the catalog/node-handling — or a proven non-call). Never report coverage while residuals are unexplained.
wpsinks)The census bulk-indexes one doc per call site (file,line,fn,class,arg). Query
the risk profile; the rare high-value classes are the must-review set (in WP core:
RCE-command 11, deserialization 13, SQL 200, SSRF 107). You can now guarantee
you've seen every one.
enrich_pipeline.py)For each high-risk site: read the arg + enclosing code, decide reachable
(request/cache/trusted/literal), guarded (which defense), severity, and a
verdict; write it back to wpsinks. This is the embedding-pipeline analogue,
but the enrichment is reasoned security judgement, and it accretes across runs.
Enrich 100% of the rare classes; queue the long tail.
trace_sink.py <file> <line>)Joins wpsinks -> wpaudit -> wpauthz -> reverse callers with NO local file
access: the sink + verdict, the enclosing function's sources/sinks/sanitizer, its
authz guards, and who calls it + whether they read a request source. The verdict
flags a SOURCE->SINK candidate when a source and an unsanitized sink coexist in a
function. (Reverse callers scan _source calls arrays because of the
array-term engine bug, and restrict common method names like load/query to
the same file to avoid class collision.)
Sink coverage ≠ total coverage. Also sweep, using the other detectors in the case
study: object-scoped authorization / IDOR (wp_authz_graph.py,
wp_checkuse_idor.py), validator completeness (wp_ssrf_ranges.py — an
incomplete allow/deny list, e.g. SSRF missing 169.254), and sanitizer
composition order (wp_compose_index.py). Verify each candidate by reading,
then by executing the flow. Trace reachability to real input.
taint_analysis.py)Once the AST is exported, run source->sink taint over the XERJ call graph: every
function that reads a request source, walked to every dangerous sink it can reach
with no sanitizer on the path (ranked by severity, full path per flow). This is
high-recall REACHABILITY triage, not precise per-argument data-flow — the SQL
flows include WP_Query (safe) and intval-guarded sinks, so read each candidate.
See TAINT-ANALYSIS.md.
gadget_hunt.py)Trace every magic method (__wakeup/__destruct/__toString/__call/...) through the
call graph to a dangerous call — the deserialization gadget surface. Flag the
AUTO-triggered ones (unserialize/free/print) as the live gadgets. WP core: 0.
See GADGET-CHAINS.md.
file:line.term on a keyword array
matches only the first element — traverse _source in code for reverse
call-graphs; boolean term matches as a string — use "true".)Every call to a known-dangerous built-in in the target (N sites, M functions, K files) is enumerated with a proven-zero-gap AST census, indexed, and triaged by vuln class; 100% of the command-exec / deserialization / SQL sinks carry an AI verdict.
Copy docs/case-studies/wordpress-security-audit/sink-census/* and this skill.
Point sink_census.py at your tree; extend php_dangerous_functions.json (or add
a language grammar + a parallel catalog) for your stack. The proof step and the
enrichment loop are language-agnostic.
まだレビューはありません。使ってみた感想をお寄せください。
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
参考ライブラリのソースをローカルで検索できる形に整え、実装前に必要なコードを取り出すスキルです。不慣れなAPIの仕様確認やアルゴリズム移植を支援します。