Ephedra-0.5-Cyber-Experimental(非公式・実験版)
XHToken/Spark-X2.6-4B に、ソースコードの脆弱性を見つけてレビューする力を LoRA で学習させた、実験的なモデルです。XHToken の非公式の派生モデルで、XHToken とは関係ありません。
- 防御のためのモデルです。 攻撃の手順・PoC・exploit のコードは学習データに入れていません。攻撃コードを頼まれたら断るように学習しています(下の「安全性」)
- 想定の使い方は、読み取り専用の道具(ファイル一覧・ファイルを読む・grep)を持ったエージェントとして、リポジトリのファイルをレビューさせることです。思考なし(
enable_thinking=False)で使ってください - このリポジトリには LoRA(アダプター、約260MB) を置いています。llama.cpp で使う GGUF 版(LoRA を統合済み):Takenoko12345678/Ephedra-0.5-Cyber-Experimental-GGUF
実験版です。実用の精度はありません。
- 区切りを1つずつ見せる使い方では、土台より少しだけ脆弱な箇所を見分けられるようになりました(AUC 0.61→0.67 など)が、見分ける力はまだ弱いです
- エージェントとしては、安全性を直す前の版(⑤)より弱くなりました。 6割以上の件で、ファイルを読み続けたまま結論を出せずに終わります(下の「エージェントとしてのレビュー」)
- ⑤は修正済みの安全なコードの約4割を「脆弱」と言っていました。このモデルではその割合は下がりましたが、結論を出す件が減ったためで、見分けがよくなったわけではありません
- 知識の問題(MMLU-Pro 理科)は、土台より 9ポイント下がりました
セキュリティの判断に、このモデルの出力だけを使わないでください。
An experimental, unofficial LoRA on XHToken/Spark-X2.6-4B for defensive source-code vulnerability review, meant to run as an agent with read-only tools (list/read/grep) and enable_thinking=False. It separates vulnerable from unrelated code chunks slightly better than the base model (AUC 0.61→0.67 on JavaScript), but as an agent it is weaker than the pre-safety-fix checkpoint: in over 60% of runs it ends without a verdict, mostly by reading files until the step limit, and it located the vulnerable line without flagging the fixed version in only 6 of 96 pairs (base 1, pre-safety-fix checkpoint 14), and explicitly called the fixed version safe in only 5 of those (base 0, pre-safety-fix checkpoint 12). Knowledge (MMLU-Pro science) dropped 9 points below the base model. Do not rely on it for security decisions. No exploit code, PoCs or attack steps were used in training, and it is trained to refuse requests for exploits.
学習の内容
- データ:GitHub Advisory Database(CC-BY-4.0)の、修正コミットが分かるアドバイザリ 3,285件(1,466 リポジトリ)。コードはすべて緩いライセンス(MIT・Apache-2.0・BSD・ISC など)のオープンソースの、修正前と修正後のファイルです
- 言語:JavaScript・TypeScript・Python(C は学習していません)
- 答えの形:ファイルを 120行ほどの区切りで見せ、
{"vulnerable": true/false, "cwe": ..., "location": "パス:行", "source": ..., "sink": ..., "missing_check": ..., "reason": ...}の JSON で答えます - 理由の文:先生役の Gemma 4 31B に、修正の差分とアドバイザリを見せて書かせ、機械の確認(行番号・コードの引用が実際のコードと合うか)に合格したものだけを使いました
- 攻撃の頼みを断る学習:上の学習で、攻撃コードを頼まれると答えてしまうようになったため、土台の Spark-X2.6-4B 自身が断った答え(318件)と、防御の質問への土台の答え(69件)を混ぜて、最後に少し学習し直しました
- LoRA:r=32、alpha=64、学習はすべて思考なし
評価
脆弱性を見つける力
区切りの見分け(AUC。修正の区切りと、関係ない区切りを見分けられるか。0.5 で当てずっぽう)
| JavaScript | Python | C(未学習) | |
|---|---|---|---|
| 土台 Spark-X2.6-4B | 0.608 | 0.590 | 0.584 |
| ⑤(安全性を直す前) | 0.653 | 0.619 | 0.596 |
| このモデル | 0.674 | 0.627 | 0.607 |
エージェントとしてのレビュー(96組:JavaScript・Python・C を32組ずつ。リポジトリの修正前と修正後のそれぞれで、読み取り専用の道具を使って調べさせ、12手以内に結論を出させます)
| 組の成功 | うち修正後を「安全」と答えた組 | 結論まで行けた割合 | 修正前を「脆弱」と言った | うち脆弱な行を当てた | 修正後を「脆弱」と言った | |
|---|---|---|---|---|---|---|
| 土台 Spark-X2.6-4B | 1 / 96 | 0 / 96 | 3% | 1 / 96 | 1 / 96 | 0 / 96 |
| ⑤(安全性を直す前) | 14 / 96 | 12 / 96 | 88% | 57 / 96 | 22 / 96 | 36 / 96(38%) |
| このモデル | 6 / 96 | 5 / 96 | 38% | 11 / 96 | 7 / 96 | 5 / 96(5%) |
「組の成功」は、修正前のファイルで脆弱な行(修正された行の前後5行)を当て、かつ修正後のファイルを「脆弱」と言わなかった組の数です。修正後で結論を出せなかった組も含みます。修正後を「安全」と答えた組だけを数えたのが、右隣の列です。
- このモデルは、エージェントとしては⑤より弱くなりました。 6割以上の件で結論を出せません。多くは、ファイルを読み続けたまま12手の上限に達したものです(192件中101件。⑤は22件)
- 修正後を「脆弱」と言う割合は⑤の38%から5%に下がりましたが、結論を出す件そのものが減ったためです。見分けがよくなったわけではありません
- 原因は、安全性を直すときに混ぜた土台自身の答え(長い文章で答える形)で、結論を早く出す癖が弱まったためだと考えています。区切りを1つずつ見せる使い方(上の表)では、⑤と答えが96%同じで、弱くなっていません
- C は学習していないので、C の組ではこのモデルは脆弱な行を1つも当てられませんでした
- ⑤の結論の確信度(
trueとfalseの確率)で「脆弱」を取り下げられるかも試しましたが、減らせませんでした。⑤の「脆弱」はほぼ全部が確率0.99以上で、当たりと修正後の誤検出を見分けられません(AUC 0.53)。別のモデルに同じ場所をもう一度判定させても同じでした(AUC 0.49〜0.53)。どちらも⑤で測った結果で、このモデル自身では測っていません。「脆弱」という答えは、確率が高くても人の確認が必要です
安全性(攻撃の頼みを断るか)
学習に使っていない頼み方・アドバイザリで調べました(思考なし、temperature 0)。攻撃の欄は「断り、攻撃に使える文字列も出さなかった」数、防御の欄は「断らずに答えた」数です。
| 攻撃の頼み(コード付き) | 攻撃の頼み(コードなし) | 攻撃の頼み(別の13問) | 防御の質問 | |
|---|---|---|---|---|
| 土台 Spark-X2.6-4B | 30 / 40 | 40 / 40 | 12 / 13 | 21 / 21 |
| ⑤(安全性を直す前) | 14 / 40 | 37 / 40 | 6 / 13 | 21 / 21 |
| このモデル | 39 / 40 | 40 / 40 | 13 / 13 | 21 / 21 |
- 自動の判定では、このモデルの4件に「攻撃の文字列」が含まれていましたが、どれも断ったうえで守り方を説明した文(「
../を含む入力を拒否する」「169.254.169.254への通信を遮断する」など)だったので、断れた数に入れています - 断れなかった1件は「何を送れば侵入できるか」という問いに、正規表現の文字の並びを示して説明したものです(攻撃に使える値は出していません)
一般の力(思考あり)
| AIME 2026(30問) | MMLU-Pro 理科(100問) | MGSM 日本語(250問) | |
|---|---|---|---|
| 土台 Spark-X2.6-4B | 60.0% | 83.0% | 76.0% |
| ⑤(安全性を直す前) | 63.3% | 75.0% | 73.2% |
| このモデル | 66.7% | 74.0% | 81.6% |
- MGSM は土台より高くなりましたが、1回ずつの測定なので、はっきり上がったとは言えません
- MMLU-Pro(物理・化学・生物から100問)は、土台より 9ポイント下がりました。 土台が正解でこのモデルが外した問題が12問、その逆が3問で、偶然とは言いにくい差です。知識を問う問題には、LoRA の学習が悪く効いています
- llama.cpp(Q8_0)、1問1回ずつ。上限は AIME 24,576・MMLU-Pro 16,384・MGSM 8,192 トークン。temperature 1.0 / top_p 0.95 / top_k 20。AIME は Mac、MMLU-Pro・MGSM は Kaggle(T4)で、表の中の同じ列は同じ環境で測っています
使い方
GGUF 版の説明を見てください。エージェントとして使うときの system プロンプトと道具の例も載せています。
利用上の注意
- 防御の目的(自分が管理するコードのレビュー、修正の確認など)にだけ使ってください。 他人のシステムへの攻撃に使うことは認めません
- 誤検出が非常に多く、見落としもあります。結果は必ず人が確認してください
- 断る学習をしていますが、完全ではありません。人向けに公開する場合は、別に安全策を用意してください
ライセンス・帰属
- Apache License 2.0(土台の Spark-X2.6-4B と同じ)
- 学習データのアドバイザリの文は GitHub Advisory Database(CC-BY-4.0)に由来します
- 理由の文は Gemma 4 31B(Apache-2.0)で生成しました