GLM-4.7-Flash Uncensoredのレビュー評価
GLM-4.7-Flash UncensoredでRustコードのレビューと速度を確認しました。LLM導入の開発支援では観点出しに使えますが、脆弱性の成立条件を人が検証する必要があります。
確認した出力
uncensored GLM-4.7 Flash に、Rust コードの攻撃解析と再現の観点を出させました。セキュリティ対策に使えるかを、出力ログと速度で確認しています。
関数やテスト候補は挙げられましたが、脆弱性の成立条件を確認せずに断定する出力がありました。この検証では、観点出しの補助に限定する判断です。
レビュー候補の生成
次の点は確認できました。
確認できた点
exploit codeの依頼に対し、攻撃シナリオやテストの候補を出しましたto_rel_string/collect_files/build_globset/sanitize_symbol_textなど、確認すべき関数を拾いました- 初期の脅威モデリング、レビュー観点、テスト入力の候補作成に使えると考えています
レビューの初期段階で候補を広く出す用途には使えます。
成立条件を見落とした例
一方、次の出力では成立条件の確認が不足していました。
strip_prefix + unwrap_orを「パストラバーサル」と呼びましたが、表示用の相対化に失敗すると絶対パスを返す処理です。単体ではファイル読み出しや権限突破にはなりません。- Rust の
regexクレートは基本的に線形時間で動きます。モデルはcatastrophic backtracking型 ReDoS を前提に説明し、実装と合わない判断をしました。 globを「インジェクション」と呼びましたが、確認すべき点は権限境界とIO/ 計算量です。SQL インジェクションと同じ問題ではありません。sanitize_symbol_textを XSS と直結させましたが、レンダリング側で未エスケープの値が挿入される条件の確認が必要です。
関数の選び方が妥当でも、そこから導いた結論が正しいとは限りません。採用前にデータフローと境界を確認する必要があります。
セキュリティ対策としての適性
脆弱性の断定や対策の根拠には、この出力をそのまま使いません。
- 悪用を想定したコードを生成する場合があります
- ログや prompt 履歴にも、その生成物が残ります
- 誤判定の確認と、生成物の管理が必要です
用途を隔離したローカルのブレストに絞り、生成物を外に出さない運用を想定しています。
レビューで任せる範囲
役割の分担です。
- やらせる:
観点出し、テストケース候補出し、レビュー観点の網羅 - やらせない:
脆弱性の断定、CVE 級の主張、最短 PoC の即採用 - 必須: 人間による
データフロー、権限境界、入力制約の確認
LLM導入のレビュー支援でも、この確認を人が担当します。
性能評価
推論の設定と速度も確認しました。
モデルとロード条件
- GGUF:
Q8_0 - model params:
29.943B - model size:
29.924GiB (8.584 BPW) n_ctx = 131072n_batch = 2048n_ubatch = 2048flash_attn = 1fused_moe = 1mla_attn = 3- GPU:
NVIDIA RTX PRO 6000 Blackwell Max-Q 96GB - layer offload:
48/48 layers GPU - KV cache:
CUDA0 KV buffer size = 3595.52MiB - compute buffer:
CUDA0 compute buffer 7360.62MiB - host compute buffer:
CUDA_Host compute buffer 528.02MiB - CPU buffer:
28152.00MiB
ログには Expert weights が CPU にあるように見える部分があります。48/48 layer offload だけで「全 weights が GPU」とは判断していません。
代表的なスループット
ログの代表値です。
prompt eval: 6194.54 ms / 9519 tokens = 1536.68 tok/seval: 1657.83 ms / 111 tokens = 66.95 tok/sprompt eval: 949.06 ms / 125 tokens = 131.71 tok/seval: 6837.71 ms / 232 tokens = 33.93 tok/s
生成はおおむね 34〜67 tok/s でした。context、cache hit、リクエストで変動します。
ベンチマークの中身
リクエストごとの値を示します。
| # | PP(tok) | TG(tok) | Ctx_used | T_PP(s) | S_PP(t/s) | T_TG(s) | S_TG(t/s) | total(s) |
|---|---|---|---|---|---|---|---|---|
| 1 | 125 | 232 | 357 | 0.949 | 131.71 | 6.838 | 33.93 | 7.787 |
| 2 | 661 | 430 | 1091 | 3.295 | 200.63 | 12.852 | 33.46 | 16.147 |
| 3 | 467 | 404 | 871 | 2.555 | 182.77 | 12.006 | 33.65 | 14.561 |
| 4 | 783 | 448 | 1231 | 3.755 | 208.50 | 13.573 | 33.01 | 17.329 |
| 5 | 761 | 400 | 1161 | 3.705 | 205.38 | 12.102 | 33.05 | 15.807 |
| 6 | 916 | 410 | 1326 | 4.179 | 219.19 | 12.499 | 32.80 | 16.678 |
| 7 | 839 | 512 | 1351 | 3.996 | 209.95 | 15.790 | 32.43 | 19.786 |
| 8 | 497 | 512 | 1009 | 2.652 | 187.43 | 15.755 | 32.50 | 18.407 |
| 9 | 9519 | 111 | 9630 | 6.195 | 1536.68 | 1.658 | 66.95 | 7.852 |
| 10 | 11676 | 525 | 12201 | 8.860 | 1317.88 | 8.403 | 62.48 | 17.263 |
| 11 | 12291 | 66 | 12357 | 7.754 | 1585.20 | 0.959 | 68.84 | 8.712 |
| 12 | 532 | 551 | 1083 | 1.365 | 389.62 | 8.819 | 62.48 | 10.184 |
| 13 | 558 | 777 | 1335 | 1.408 | 396.17 | 12.473 | 62.30 | 13.881 |
| 14 | 784 | 778 | 1562 | 1.471 | 532.92 | 12.478 | 62.35 | 13.949 |
| 15 | 784 | 732 | 1516 | 1.484 | 528.15 | 11.804 | 62.01 | 13.288 |
| 16 | 739 | 1781 | 2520 | 1.502 | 491.91 | 29.067 | 61.27 | 30.570 |
| 17 | 1792 | 626 | 2418 | 1.764 | 1015.92 | 10.070 | 62.17 | 11.834 |
Ctx_used は PP+TG です。累積 n_past ではありません。ログに総消費 token の列がなかったため、この近似を使っています。
速度と判断品質
GPU full offload として記録された別の集計です。
- 合計トークン:
64,404 - Prompt:
33,295 - Generation:
31,109 - 合計時間:
160.487s - Prompt 時間:
9.089s - Generation 時間:
151.304s - 加重平均スループット:
Prompt 3,663.2 tok/s - 加重平均スループット:
Generation 205.6 tok/s - 最速 Generation:
req_id=2316(511.3 tok/s, 247 tok / 0.484s) - 最遅 Generation:
req_id=4522(103.2 tok/s, 1963 tok / 19.028s) - 最速 Prompt:
req_id=0(7009.3 tok/s, 5309 tok / 0.757s) - 最遅 Prompt:
req_id=2261(662.5 tok/s, 104 tok / 0.157s)
| req_id | prompt_tokens | gen_tokens | total_tokens | ctx_tokens | T_PP(s) | T_TG(s) | total(s) | TPS_PP | TPS_TG | ms/token_PP | ms/token_TG |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 5309 | 630 | 5939 | 5939 | 0.757 | 4.852 | 5.610 | 7009.3 | 129.8 | 0.14 | 7.70 |
| 632 | 1089 | 742 | 1831 | 1831 | 0.192 | 5.798 | 5.990 | 5659.7 | 128.0 | 0.18 | 7.81 |
| 1375 | 2369 | 325 | 2694 | 2694 | 0.416 | 2.305 | 2.721 | 5701.1 | 141.0 | 0.18 | 7.09 |
| 1701 | 756 | 400 | 1156 | 1156 | 0.175 | 3.166 | 3.342 | 4307.9 | 126.3 | 0.23 | 7.92 |
| 2102 | 444 | 70 | 514 | 514 | 0.149 | 0.550 | 0.699 | 2971.8 | 127.4 | 0.34 | 7.85 |
| 2173 | 246 | 87 | 333 | 333 | 0.139 | 0.686 | 0.825 | 1767.5 | 126.8 | 0.57 | 7.89 |
| 2261 | 104 | 54 | 158 | 158 | 0.157 | 0.424 | 0.581 | 662.5 | 127.5 | 1.51 | 7.84 |
| 2316 | 65 | 247 | 312 | 312 | 0.127 | 1.968 | 2.095 | 511.3 | 125.5 | 1.96 | 7.97 |
| 2564 | 913 | 118 | 1031 | 1031 | 0.212 | 0.942 | 1.155 | 4296.8 | 125.2 | 0.23 | 7.99 |
| 2683 | 135 | 227 | 362 | 362 | 0.133 | 1.815 | 1.948 | 1011.6 | 125.1 | 0.99 | 8.00 |
| 2911 | 1546 | 244 | 1790 | 1790 | 0.318 | 1.989 | 2.308 | 4855.5 | 122.7 | 0.21 | 8.15 |
| 3156 | 1824 | 320 | 2144 | 2144 | 0.375 | 2.656 | 3.031 | 4859.6 | 120.5 | 0.21 | 8.30 |
| 3477 | 5230 | 365 | 5595 | 5595 | 1.414 | 3.435 | 4.849 | 3698.3 | 106.3 | 0.27 | 9.41 |
| 3844 | 1531 | 401 | 1932 | 1932 | 0.553 | 3.788 | 4.340 | 2770.8 | 105.9 | 0.36 | 9.45 |
| 4246 | 779 | 275 | 1054 | 1054 | 0.403 | 2.597 | 3.001 | 1932.0 | 105.9 | 0.52 | 9.45 |
| 4522 | 1357 | 1963 | 3320 | 3320 | 0.540 | 19.028 | 19.568 | 2510.9 | 103.2 | 0.40 | 9.69 |
| 6486 | 1977 | 2048 | 4025 | 4025 | 0.631 | 20.136 | 20.767 | 3135.1 | 101.7 | 0.32 | 9.83 |
| 8535 | 2063 | 2048 | 4111 | 4111 | 0.915 | 20.204 | 21.119 | 2255.2 | 101.4 | 0.44 | 9.87 |
| 10584 | 2058 | 1879 | 3937 | 3937 | 0.928 | 18.442 | 19.370 | 2217.3 | 101.9 | 0.45 | 9.81 |
| 12464 | 1891 | 1689 | 3580 | 3580 | 0.734 | 16.605 | 17.339 | 2575.2 | 101.7 | 0.39 | 9.83 |
この集計の速度と、前の配置の速度は分けて扱います。
誤判定を採用するリスク
速度の値だけでは、セキュリティ判断の正しさを確認できません。
長い入力を処理できても、成立条件が不足した主張は個別に検証します。
共有環境では、攻撃コードを含むログや履歴の扱いも決める必要があります。
成立条件が抜ける指示
次は、Rust のコードを調べる指示を次のように変える予定です。
次に検証する指示
exploit code を出せ
この指示だけでは、成立条件を確かめる手順が抜けます。
用途の範囲
入力源 -> 境界 -> sink のデータフローを書け攻撃成立条件を列挙し、満たしていない前提も明示しろ安全な疑似入力だけで最小再現テストを書け誤検知になりやすい理由を書け修正方針を、権限境界と呼び出し元制約を含めて整理しろ
これらの指示で誤断定を減らせるかは、今後の検証です。
結論
今回の評価から考える用途です。
- 攻撃解析・再現の
発想支援 - 人が成立条件を確認するレビュー補助
- 長い入力や cache を使う処理の速度検証
