ClawHubがローンチしたとき、AIエージェントランタイムを拡張する明らかな方法に見えた。スキルのマーケットプレイス——必要なものをインストールし、不要なものはスキップし、自分のものを貢献する。このモデルはブラウザ拡張機能、VS Codeプラグイン、npmパッケージで機能した。AIエージェントでなぜ機能しないのか?
2026年初頭、答えは明確になった。セキュリティ研究者は公開されているClawHubスキルの41.7%に脆弱性が含まれていることを発見した。数百は完全に悪意があった——インストールしたユーザーを侵害するために特別にアップロードされたパッケージだ。プラグインモデルは、マシン上で昇格した権限で動くソフトウェアに適用されると根本的な問題があることが判明した。
ZeroClawはこの失敗モードを念頭に設計された。プラグインシステムの代わりに、Rustトレイトを使う。
ランタイムプラグインシステムの何が問題か
従来のプラグインシステムの核心的な問題は実装の品質ではない——モデル自体だ。プラグインをインストールするとき、インターネットからコードをダウンロードしてアプリケーションのプロセス内で、アプリケーションの権限で実行している。プラグインはファイルを読み取り、ネットワークにアクセスし、環境変数を読み取り、アプリケーションができる他のことを何でもできる。
テキストエディタのプラグインがシンタックスハイライトを追加するのには問題ない。認証情報、ファイルシステム、チャットチャンネルへのアクセスを持つAIエージェントランタイムには問題だ。
特定の失敗モードは予測可能だ。ランタイムコードロードはプラグインがホストプロセス内で任意のコードを実行することを意味する——サンドボックスなし、分離なし、ケイパビリティモデルなし。デフォルトの信頼はプラグインがインストールされると、ホストアプリケーションと同じ権限を持つことを意味する。サプライチェーン攻撃は簡単だ:人気のあるパッケージに似た名前のパッケージを公開し、ユーザーがインストールするのを待つ。プラグイン間のバージョン競合はデバッグが難しくプラットフォームレベルで防ぐことが不可能な依存関係地獄を作る。
OpenClawのClawHubは2026年にこれらの失敗モードのすべてを実証した。悪意あるスキルは洗練されていなかった——マーケットプレイスを信頼したユーザーによってインストールされたパッケージだっただけだ。
トレイト:異なるモデル
Rustトレイトはコンパイラによって強制されるインターフェースコントラクトだ。実装が提供しなければならないメソッド、それらのメソッドが受け入れて返す型、維持しなければならないスレッド安全性の保証を定義する。ZeroClawのチャンネルトレイトを簡略化したもの:
```rust
pub trait Channel: Send + Sync + 'static {
fn name(&self) -> &str;
async fn connect(&mut self) -> Result<()>;
async fn receive(&self) -> Result
すべてのチャンネル——Telegram、Discord、WhatsApp、Signal、Matrix、IRC——このトレイトを実装する。コンパイラは型安全性(DiscordのレスポンスをTelegramチャンネルに送れない)、スレッド安全性(`Send + Sync`バウンドが安全な並行アクセスを保証)、完全性(すべての必要なメソッドを実装しなければならない——ランタイムでの「メソッドが見つからない」エラーなし)を保証する。
重要なのは:新しいチャンネルはランタイムではなくバイナリにコンパイルされる。コードインジェクションなし、動的ロードなし、インストール時に行うべき信頼の決定なし。拡張機能は実行される前にコンパイラによって検証される。
新しいチャンネルを追加する
ZeroClawを拡張する実際の体験はトレイトを実装することだ。Matrixチャンネルアダプターの例:
```rust pub struct MatrixChannel { homeserver: String, client: MatrixClient, }
impl Channel for MatrixChannel { fn name(&self) -> &str { "matrix" }
async fn connect(&mut self) -> Result<()> { self.client = MatrixClient::new(&self.homeserver).await?; self.client.login().await?; Ok(()) }
async fn receive(&self) -> Result
async fn send(&self, msg: Response) -> Result<()> { self.client.send_text(&msg.channel_id, &msg.text).await?; Ok(()) }
async fn disconnect(&self) -> Result<()> { self.client.logout().await } } ```
完全なチャンネルアダプターに約50行だ。コンパイラはコードが出荷される前に実装が正しいことを検証する。メソッドの実装を忘れたり、間違った型を返したり、スレッド安全性の制約に違反したりすると、コンパイルエラーが出る——本番でのランタイムクラッシュではなく。
すべての拡張ポイントで同じパターン
ZeroClawはシステムが拡張可能である必要があるすべての場所でトレイトを使う。AIプロバイダーは`Provider`トレイトを実装する:
```rust
pub trait Provider: Send + Sync {
async fn complete(&self, messages: &[ChatMessage]) -> Result
OpenAIからAnthropicからOllamaへの切り替えは、異なるHTTPコールで同じトレイトを実装することだ。ZeroClawの残りの部分はどのプロバイダーがアクティブかを知らず、気にしない——トレイトメソッドを呼び出すだけだ。
ツールは事前に権限を宣言することを要求する`Tool`トレイトを実装する:
```rust
pub trait Tool: Send + Sync {
fn name(&self) -> &str;
fn description(&self) -> &str;
async fn execute(&self, args: Value) -> Result
すべてのツールは実行前に必要なもの——ファイルアクセス、ネットワークアクセス、特定のパス——を宣言する。ランタイムはそれらの宣言に基づいてアローリストを強制する。`~/documents`への読み取りアクセスが必要だと主張するツールは`~/.ssh`にサイレントにアクセスできない。
メモリバックエンドは`MemoryBackend`トレイトを実装する——だからSQLiteがデフォルトだが、他のコードを変更せずに代替バックエンドが可能だ。
セキュリティ比較
| 側面 | プラグインシステム | トレイトシステム | |--------|--------------|-------------| | コードの出所 | ランタイムにダウンロード | ビルド時にコンパイル | | 検証 | 信頼ベース | コンパイラ検証 | | 権限 | ランタイム、しばしば未チェック | 型で宣言、強制 | | サプライチェーン | 脆弱 | 外部コードロードなし | | 型安全性 | ランタイムエラー | コンパイル時エラー | | 並行性 | 競合状態が可能 | データ競合が不可能 |
重要な洞察はシンプルだ:サプライチェーンがなければサプライチェーン攻撃はできない。ZeroClawの拡張機能はコンパイルされており、ダウンロードされない。侵害するマーケットプレイスなし、タイポスクワッティングするパッケージなし、インストール時に行うべき信頼の決定なし。
実際のトレードオフ
トレイトアプローチはファイルをダウンロードして新しいチャンネルをインストールできないことを意味する。カスタム拡張機能を追加するにはRustを書き、ZeroClawのソースに追加し、新しいバイナリをコンパイルする必要がある。ほとんどのユーザーにとって、30以上の組み込みチャンネルとツールが必要なすべてをカバーする。カスタム拡張機能が必要な開発者にとって、トレイトシステムは実装するための明確で型安全なコントラクトを提供する。
そのトレードオフは意図的だ。小さく検証された拡張面は大きく未検証のものより良い。OpenClawのClawHubはエコシステムの規模をセキュリティより優先するとどうなるかを証明した。ZeroClawは反対を最適化し、CVEの数がその選択を反映している。