前景提要:
前期提要:Grok Build 会偷偷打包上传用户的代码仓库...
只需要在Clash中添加以下规则就行:
AND,((PROCESS-NAME,grok.exe),(DOMAIN-SUFFIX,storage.googleapis.com)),REJECT
会同时匹配grok.exe和上传的域名端点,可以通过yaml或者js覆写的方式添加,不懂的问问ai
以及修改~/.grok/conf…
起因是用 Grok Build 时发现流量不正常
发现 grok.exe 往 storage.googleapis.com 上传了很多GB流量,而 grok 本身的模型url是 cli-chat-proxy.grok.com
让 grok 自己分析,它分析出grok.exe把我整个仓库打包上传了,因为仓库有很多大文件,所以流量特别大 ^-^
遂让 deepseek 分析了…
提供两个修补脚本,分别用于屏蔽 Grok Build 的上传和更新功能。
Windows 版我没环境测,目前只在 macOS 上跑过。
脚本顶部注释里写了还原方法,手动更新前记得先执行还原,否则会更新报错。
MacOS M系列芯片版本
#!/usr/bin/env bash
# 补丁:阻止 Grok Build 上传代码到 Google 硬盘 + 打断自动更新(防补丁被强制覆盖)
#
# 手法:同长字节替换二进制里的硬编码域名/仓库,再 ad-hoc 重签,最后上不可变标志锁死文件。
# 1) storage.googleapis.com -> null.null.null.invalid
# 同一域名既是代码上传目标,又是更新主下载源 → 一箭双雕(上传废 + 主更新废)
# 2) xai-org-shared/grok-build -> blocked-by-user/no-update
# GitHub Releases 回退用的仓库名,改废 → gh 回退更新失败
# 3) chflags uchg 锁二进制 → 自动/手动更新都写不动它
#
# 还原:
# chflags nouchg ~/.grok/downloads/grok-macos-aarch64
# cp ~/.grok/downloads/grok-macos-aarch64.orig ~/.grok/downloads/grok-macos-aarch64
# codesign -f -s - ~/.grok/downloads/grok-macos-aarch64
#
# grok 若被手动重装(x.ai/cli/install.sh)覆盖:先 nouchg,再重跑本脚本。
set -euo pipefail
BIN="$HOME/.grok/downloads/grok-macos-aarch64"
# 替换对:FROM|TO,每对必须等长
PAIRS=(
"storage.googleapis.com|null.null.null.invalid"
"xai-org-shared/grok-build|blocked-by-user/no-update"
)
[ -f "$BIN" ] || { echo "找不到二进制 $BIN"; exit 1; }
# 长度自检
for p in "${PAIRS[@]}"; do
FROM="${p%%|*}"; TO="${p##*|}"
[ "${#FROM}" -eq "${#TO}" ] || { echo "长度不符: '$FROM'(${#FROM}) vs '$TO'(${#TO}),中止"; exit 1; }
done
# 解锁(若之前锁过,best-effort)
chflags nouchg "$BIN" 2>/dev/null || true
# 备份原始(仅首次)
if [ ! -f "$BIN.orig" ]; then
cp "$BIN" "$BIN.orig"
echo "已备份 -> $BIN.orig"
fi
# 从干净副本逐对替换到临时文件
cp "$BIN.orig" "$BIN.tmp"
for p in "${PAIRS[@]}"; do
FROM="${p%%|*}"; TO="${p##*|}"
N=$(strings -a "$BIN.tmp" | grep -cF "$FROM" || true)
echo "命中 '$FROM': $N 处"
[ "$N" -gt 0 ] || { echo "警告: '$FROM' 无命中(版本可能已变),中止以免误伤"; rm -f "$BIN.tmp"; exit 1; }
LC_ALL=C perl -i -pe "s{\Q$FROM\E}{$TO}g" "$BIN.tmp"
done
chmod 755 "$BIN.tmp"
mv "$BIN.tmp" "$BIN"
# 原签名已失效,ad-hoc 重签
codesign --remove-signature "$BIN" 2>/dev/null || true
codesign -f -s - "$BIN"
# 验证残留
echo "--- 验证 ---"
for p in "${PAIRS[@]}"; do
FROM="${p%%|*}"; TO="${p##*|}"
echo "残留 '$FROM': $(strings -a "$BIN" | grep -cF "$FROM" || true) | 新 '$TO': $(strings -a "$BIN" | grep -cF "$TO" || true)"
done
codesign -dv "$BIN" 2>&1 | grep -E 'Signature|flags' || true
# 锁死文件(不可变),自动/手动更新写不动
chflags uchg "$BIN"
echo "已上锁 uchg。ls -lO 可见 uchg 标志。"
echo "完成。跑 grok 冒烟测试确认能启动。"
Windows Powershell管理员运行版本
# 补丁(Windows/PowerShell):阻止 Grok Build 上传代码到 Google 硬盘 + 打断自动更新
#
# 手法:同长字节替换 grok.exe 里硬编码的域名/仓库,再用 icacls 拒写/删锁死文件。
# 1) storage.googleapis.com -> null.null.null.invalid (上传目标 + 更新主下载,一箭双雕)
# 2) xai-org-shared/grok-build -> blocked-by-user/no-update (GitHub Releases 回退仓库)
# PE 二进制改字节无需重签,Windows 照跑(不像 macOS hardened runtime)。
#
# 需管理员:icacls 拒绝 Everyone 写/删,连以用户身份跑的自动更新也覆盖不了。脚本自提权。
#
# 还原:
# icacls "<bin>" /remove:d "*S-1-1-0"
# attrib -R "<bin>"
# Copy-Item "<bin>.orig" "<bin>" -Force
#
# 若被手动重装(install.ps1)覆盖:先解锁(见还原),再重跑本脚本。
$ErrorActionPreference = 'Stop'
# ── 自提权到管理员 ────────────────────────────
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Host "提权到管理员..."
Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
exit
}
# ── 定位二进制 ────────────────────────────────
$dir = Join-Path $env:USERPROFILE '.grok\downloads'
$bin = $null
if (Test-Path $dir) {
$bin = Get-ChildItem $dir -Filter 'grok-*windows*.exe' -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
if (-not $bin) { $bin = Get-ChildItem $dir -Filter 'grok*.exe' -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName }
}
if (-not $bin) {
$cmd = Get-Command grok -ErrorAction SilentlyContinue
if ($cmd) { $bin = $cmd.Source }
}
if (-not $bin -or -not (Test-Path $bin)) { throw "找不到 grok 二进制,手动设 `$bin" }
Write-Host "二进制: $bin"
# ── 替换对(FROM -> TO,须等长,ASCII)────────
$pairs = @(
@{ From = 'storage.googleapis.com'; To = 'null.null.null.invalid' }
@{ From = 'xai-org-shared/grok-build'; To = 'blocked-by-user/no-update' }
)
foreach ($p in $pairs) {
if ($p.From.Length -ne $p.To.Length) { throw "长度不符: '$($p.From)'($($p.From.Length)) vs '$($p.To)'($($p.To.Length))" }
}
# ── 解锁(若之前锁过)+ 备份 ──────────────────
& icacls $bin /remove:d "*S-1-1-0" > $null 2>&1
attrib -R $bin 2>$null
$orig = "$bin.orig"
if (-not (Test-Path $orig)) { Copy-Item $bin $orig; Write-Host "已备份 -> $orig" }
# ── 字节替换(从干净副本)────────────────────
$enc = [Text.Encoding]::ASCII
$bytes = [IO.File]::ReadAllBytes($orig)
function Count-Bytes([byte[]]$hay, [byte[]]$needle) {
$n = 0
for ($i = 0; $i -le $hay.Length - $needle.Length; $i++) {
$m = $true
for ($j = 0; $j -lt $needle.Length; $j++) { if ($hay[$i+$j] -ne $needle[$j]) { $m = $false; break } }
if ($m) { $n++; $i += $needle.Length - 1 }
}
return $n
}
function Replace-Bytes([byte[]]$hay, [byte[]]$needle, [byte[]]$repl) {
for ($i = 0; $i -le $hay.Length - $needle.Length; $i++) {
$m = $true
for ($j = 0; $j -lt $needle.Length; $j++) { if ($hay[$i+$j] -ne $needle[$j]) { $m = $false; break } }
if ($m) { for ($j = 0; $j -lt $repl.Length; $j++) { $hay[$i+$j] = $repl[$j] }; $i += $needle.Length - 1 }
}
}
foreach ($p in $pairs) {
$fb = $enc.GetBytes($p.From); $tb = $enc.GetBytes($p.To)
$c = Count-Bytes $bytes $fb
Write-Host "命中 '$($p.From)': $c 处"
if ($c -le 0) { throw "'$($p.From)' 无命中(版本可能已变),中止以免误伤" }
Replace-Bytes $bytes $fb $tb
}
[IO.File]::WriteAllBytes($bin, $bytes)
# ── 验证 ──────────────────────────────────────
Write-Host "--- 验证 ---"
$after = [IO.File]::ReadAllBytes($bin)
foreach ($p in $pairs) {
$fb = $enc.GetBytes($p.From); $tb = $enc.GetBytes($p.To)
$rf = Count-Bytes $after $fb; $rt = Count-Bytes $after $tb
Write-Host "残留 '$($p.From)': $rf | 新 '$($p.To)': $rt"
}
# ── 锁死:只读 + icacls 拒绝 Everyone 写/删/追加/改属性 ──
attrib +R $bin
& icacls $bin /inheritance:d > $null
& icacls $bin /deny "*S-1-1-0:(WD,AD,WA,DE)" > $null
Write-Host "已上锁(只读 + icacls deny Everyone 写/删)。"
Write-Host "完成。跑 'grok --version' 冒烟测试确认能启动。"