← 回到四專案比較

獨立審查 · 完整回覆

Clawdline v2.1.2

Clawdline v2.1.2 · Claude Code · 讀取安全程式碼

2026-10-22239adc8ad ↗僅讀公開網路

確切題目

Is there a security risk in installing this tool? Read the security-related code in this repository and understand its encryption and data transmission mechanisms before answering. If a mechanism cannot be verified from the accessible code, say so.
題目附帶的固定版本連結 ↗

下方完整保留 agent 原始回覆,原文語言有明確標示。中文導讀是編輯整理,不是原文,也不是驗證結論。審查沒有執行安裝或攻擊測試。

中文導讀(編輯整理)

認可驗簽、內容加密與受保護的配對;提醒裝置權限、檔案式金鑰及未追蹤的撤銷換鑰。

實際閱讀範圍:透過網頁摘要閱讀約 15 個安全檔案;未完整追蹤 setup、瀏覽器金鑰儲存與撤銷接線。

審查另附的 v2.1.2 發行頁

這份回覆針對固定來源 239adc8ad 與 v2.1.2。該來源的 README 仍寫 v2.1.1,後來主線已改為 v2.1.2;這不代表 v2.1.2 發行檔缺失。閱讀者未追蹤的認證/換鑰接線,不等於已證實該機制不存在。

下載完整英文原文 · SHA-256 d8a61fb19237ff2e3bf1a96f22749318fe939aa15dec417194a1aa71e30850c5

完整英文原始回覆(未翻譯)

I don’t see a red flag in this tool. The installer and the encryption are carefully built, and I found nothing that looks hidden or malicious. Most of the real risk comes from what the tool does by design, not from installing it.

What I couldn’t check: My page fetcher returns summaries, not raw source, and I read about 15 key files rather than the whole repository.

How installing works

  • Signed downloads. install.sh verifies a signed release list (Ed25519, through your local OpenSSL 3) against one public key built into the script. It then checks the download’s size and SHA-256. I found no path that installs anything unchecked. It uses no sudo and no eval.
  • User-level only. Files go under ~/.local/share/clawdline-next and ~/.config/clawdline-next. The release’s own setup command creates the background service, but I didn’t read that code.
  • Updates. Updates must be signed by a key built into the running program. Automatic updates are off by default. Going back to an older version requires --force.
  • Where the signing key lives. It’s a GitHub Actions secret behind a maintainer-approval step, plus one offline copy. If the maintainer’s GitHub account or that secret leaked, an attacker could ship a validly signed bad release. Releases also carry GitHub build-provenance attestations, and the macOS builds are notarized.

Encryption with Cloud turned on (Cloud is off by default)

  • The basics. Content is encrypted with AES-256-GCM using a random 12-byte nonce, and each message is signed with Ed25519. The signature is checked before anything is decrypted, and messages from unknown senders are refused. Replayed messages are rejected.
  • Pairing a browser. This uses a standard key exchange (X25519 and HKDF-SHA256). The browser’s offer is encrypted with a secret kept in the link’s #pair= part, which never reaches the server; the server only gets a hash of it. That should stop Cloud from swapping in its own key. You also compare 16-character fingerprints on both screens.
  • What Cloud can see. Account and device IDs, channel names, timing, message sizes and your IP address, but not the content.

Risks that come with the design

  1. A paired device can control your machine. The README says it can send instructions or use a terminal, which means it can run code. Anyone who gets a pairing link while it’s valid gets that access. Pairing offers expire after 10 minutes. The code comments say a link can be claimed only once, but that check isn’t in the file I read.
  2. Removing a device doesn’t change the key. Each machine has one content key shared with every paired browser. Removing a device stops the machine from accepting its requests, but the docs describe no key-change step. A removed browser still holds the key, which matters if it ever gets traffic through Cloud or a leak. A rekey.go file exists, but I didn’t check whether removal triggers it.
  3. Keys are plain files. The local keys are files readable only by your user account, not stored in hardware. Anything running as you can read them.
  4. Some network traffic happens even with Cloud off. Update checks go to GitHub and app.clawdline.com/BUILD.json. Direct phone connections ask STUN servers run by Google and Cloudflare, which see your IP address.
  5. Notifications can show plaintext. Push titles and bodies can appear in readable form on a phone’s lock screen.
  6. Local web access is reasonably protected. The local web server only accepts localhost names or your Tailscale name, which guards against DNS-rebinding attacks. It also checks where requests come from and uses SameSite=Strict cookies.

What I couldn’t confirm from the code

  • That the published v2.1.2 files were actually built from this source. The builds aren’t documented as reproducible, so you’re trusting the CI pipeline.
  • How the Cloud server behaves, what it stores and for how long. Its code isn’t public, and the project’s docs say this too.
  • That the machine_signing_key sent to browsers is a public key and not the private one. The comments say it’s public, but I didn’t trace where it’s created.
  • Whether passwords and tokens are compared in constant time (auth.Verify and VerifySecret).
  • How the browser stores its keys, and whether the key objects can be exported.
  • What the whisper (transcription), healthupload and push parts of the program send, if anything.

Recommendation

Installing it is reasonable if you trust this maintainer and GitHub. To keep risk low:

  • Leave Cloud off unless you need it.
  • If you turn it on, use clawdline cloud commands off when you only need to read, and pair only devices you trust.
  • Treat pairing links like passwords.
  • Leave automatic updates off if you’d rather review each release first.

One small thing: at this commit the README tells you to install --version v2.1.1, not v2.1.2. Use --version v2.1.2 if you want this release.

← 回到比較表