
Grok Bot で自分の Mac の脆弱性チェックを毎日回してみた
はじめに
クラウド事業本部、あきやまです。
最近脆弱性関係のニュースが多いですね。自分の Mac に入っているアプリや Homebrew パッケージが、いま出ている CVE の影響を受けるのか調査したいですが、手作業だと続かないので、Grok Bot 上に「読み取り専用で構成を取り、脆弱性情報と照合してチャットに報告する」ボットを立ててみました。
この記事では、立てたボットの動きと、Grok Bot 側が処理をどう分担しているかを、実際に動かした結果も合わせて書いていきたいと思います。
環境
| 項目 | 値 |
|---|---|
| OS | macOS 26.7.2 |
| 端末 | 自分の Mac(ローカル実行を許可) |
| アプリ | Grok Bot 0.78.1 |
| ボット名 | Security checker(途中まで securitycheck / Vuln Watch) |
| ルーティン | daily-security-check |
| スケジュール | 毎日 8:30 JST 前後(flexible、前後 15 分程度) |
※ 画面キャプチャは、他ボット名とアカウント名をモザイクしています。
結論
Grok Bot の定期ルーティンと、Mac 上のローカル実行(Computer Use)を組み合わせると、「毎日 1 回、読み取り専用で inventory を取り、公開の脆弱性情報と照合してチャットへ報告する」流れを組めました。
アップデートや削除はボットにやらせず、対処コマンドを提案させるだけにしています。
| 確認項目 | 結果 |
|---|---|
| 定期実行 | ルーティンで毎日 8:30 JST ごろに起動できる |
| Mac 情報の取得 | 読み取り専用コマンドをローカル実行し、毎回承認が出る |
| 脆弱性照合 | Apple / NVD / CISA KEV / JVN / ベンダー発表を一次情報として確認する前提 |
| 報告先 | 当該ボットのチャットのみ(Slack 送信なし) |
| 変更操作 | アップデートや削除は実行しない。提案だけ |
初回チェックでは、照合対象がおおよそ 138 件(アプリ 47 / Homebrew 78 / cask 13)で、影響あり 9 件、要確認 2 件でした。
悪用が確認されている brotli を先頭に報告し、その後こちらで更新・削除した分は、再スキャンで「解消」と「未対処」に分かれました。
Grok Bot の処理の仕組み
ここがこの記事の本題です。
画面上は「チャットにボットがいる」ように見えますが、処理の本体は次の一本道です。
Grok Bot のデスクトップアプリは、この流れの入口(ルーティン設定)と出口(チャット表示)です。
Mac の構成取得だけがローカル実行で、調査・照合・文章化はクラウド側のエージェントが担います。
UI 層(デスクトップアプリ)
Grok Bot アプリは、ボットの一覧と各ボットのチャット、右側の詳細パネルを出します。
Security checker を選ぶと、会話と Routines が見えます。

右側の Routines には、毎日動かす単位が並びます。
自分が使ったのは daily-security-check で、トグルがオンならスケジュールどおりに起動します。

エージェント層(ボット本体)
ボット本体は、チャットに見える「Security checker」そのものです。
ここに次を持たせます。
- プロフィール(役割文): 唯一の仕事、毎日の流れ、報告フォーマット、やらないこと
- 会話履歴: 報告とユーザーからの質問
- ルーティン: cron 相当のスケジュールと、起動時に渡す prompt
- 作業領域: inventory や findings のファイル(ボット側)
プロフィールでは、対象を「この Mac の OS・インストール済みアプリ・設定」に絞り、社内システムや AWS アカウントの診断はやらないと書いてあります。
報告は日本語で短く、危険度は誇張も軽視もしない、という声の指定も入れています。
ルーティン作成時のイベントはチャットにも出ます。
cron は 30 8 * * *(Asia/Tokyo)、flexible で前後 15 分程度、初回の定期実行は翌朝、という形でした。
ルーティンの prompt には、プロフィールの手順に従って inventory を取り、前回以降の脆弱性情報と照合し、影響なしでも 1 通必ず報告する、と書いてあります。
ローカル実行層(Computer Use)
Mac の構成を取る部分だけは、クラウド側だけでは完結しません。
Grok Bot がローカルの Computer Use(ローカル実行デーモン)経由で、自分の Mac に読み取り専用コマンドを投げます。
実際にプロフィールへ書いた例は次です。
sw_vers
system_profiler SPApplicationsDataType # 名前とバージョンだけ使う
brew list --versions
brew list --cask --versions
softwareupdate --list
fdesetup status
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
spctl --status
csrutil status
ポイントは次です。
- 毎回 Mac 側に承認が出る
ローカル実行は、ユーザーが許可した範囲で動きます。自分は毎回承認が出ることを了承済み、とプロフィールに書いてあります。 - 読み取り専用に限定する
アップデート、インストール、アンインストール、設定変更、ファイル削除はやらない、と明記しています。 - 結果はボット側に日付付きで保存する
inventory はボット側の作業領域へ日付ごとに残し、翌日以降は差分を見やすくします。 - オフラインや拒否時は直近 inventory で照合する
承認されなかった日や Mac がオフの日は、その旨を報告に書かせます。
つまり「頭脳とスケジュールと脆弱性調査」はクラウド側、「この Mac に何が入っているか」だけをローカル実行で取りにいく、という分担です。
照合と報告層
inventory が取れたら、ボットは公開の一次情報を見にいきます。
情報源として指定したのは次です。
- Apple Security Releases
- NVD / CVE
- CISA KEV(悪用が確認された脆弱性)
- JVN
- inventory にあるアプリのベンダーアドバイザリ(Chrome、Slack、Zoom、Cursor、Homebrew パッケージなど)
判定は 3 つです。
| 判定 | 意味 |
|---|---|
| 影響あり | インストール版が脆弱性の影響範囲に入る |
| 要確認 | バージョン特定ができない、修正版が未公開など |
| 影響なし | 照合した範囲では該当しない |
報告フォーマットは次です。
- 影響あり・要確認があれば、対象(名前と今の版)、CVE、深刻度(CVSS と KEV 掲載の有無)、修正版、対処方法、一次情報のリンク
- KEV 掲載など悪用確認済みを先頭に置く
- 何もなければ「今日は影響なし(照合件数と情報源)」と一言
- 同じ CVE を毎日繰り返さず、2 日目以降は未対処件数にまとめる
- findings を CSV に追記する(date, cve, product, installed_version, fixed_version, severity, kev, status, link)
チャット上の報告例です。

削除を頼んでも、ボットは自分では実行せず、ターミナル用のコマンドだけ返します。プロフィールの「やらないこと」が反映されている状態です。
やってみた
Step 1: ボットを立てて役割を固定する
Grok Bot で新しいボットを作り、仕事を 1 つに絞ったプロフィールを書きました。
役割を狭くすると、定期実行時に「ついでに別のことをする」余地が減ります。
実際に入れた定義文は次です(ホスト名や個人名は一般化しています。
Security checker の定義文
Step 2: ルーティンを作る
ルーティン名は daily-security-check、スケジュールは毎日 8:30 JST(flexible)です。
起動時 prompt には、プロフィールの毎日の流れに従うこと、読み取り専用であること、影響なしでも 1 通送ることを入れました。
チャット上では、ルーティン作成のあと「毎朝 8:30 ごろにこのチャットへ 1 通送る設定にした。初回の定期実行は明日の朝」と返ってきました。
今日の分は初回なので、直近 30 日分を対象にすぐ走らせています。
Step 3: 初回チェックを見る
初回のサマリは次でした。
| 項目 | 値 |
|---|---|
| 照合件数 | 138(アプリ 47、Homebrew 78、cask 13) |
| 影響あり | 9 |
| 要確認 | 2 |
| 最優先 | brotli(KEV 掲載) |
影響ありの例(当時):
- Homebrew brotli 1.2.0(KEV)
- Homebrew node 25.5.0(brotli 経由の影響を含む)
- Zoom 7.1.9
- Xcode 26.6
- Claude Code 2.1.228
- Ghostty 1.3.1
- iTerm2 3.6.6
- gh 2.94.0
- openssl@3 3.6.2
要確認は、古い go が残っていることと、sqlite の修正版未公開でした。
macOS、Safari、Chrome、Slack、Cursorは影響なし。
FileVault / Gatekeeper / SIP は有効で、ファイアウォールだけオフ、という報告もありました。
Step 4: 変更は人がやり、ボットは再スキャンする
Ghostty の削除をチャットで頼むと、ボットは次だけ返してきました。
brew uninstall --cask ghostty
# 設定まで消すなら
brew uninstall --zap --cask ghostty
こちらで brotli / node の更新や Ghostty の削除などを行ったあと、再スキャンすると「解消した件数」と「未対処の件数」に分かれて報告されました。
毎日の本運用では、新規分と未対処件数だけに絞る想定です。
注意点・制約
- ローカル実行は承認が必要です。 Mac がスリープしていたり、承認をスキップしたりすると、その日は直近 inventory 頼みになります。
- ボットは変更しません。 便利さより、勝手にアップデートされないことを優先しています。
- 一次情報を取れていないことは書かせない、とプロフィールに入れています。それでも LLM ベースなので、リンク先と版番号は自分でも一度見た方がいいです。
- 対象は個人 Mac です。 社内システムやクラウドアカウントの診断には使っていません。
- 他ボットの仕事と混ぜない方が安定します。経理ボットや学習ボットとは役割を分けました。
まとめ
- Grok Bot のルーティンで、毎日の脆弱性チェックを起動できる
- Mac の構成取得はローカル Computer Use、調査と報告はクラウド側エージェント、という分担になっている
- 読み取り専用と報告フォーマットをプロフィールに書くと、振る舞いがかなり固定できる
- 初回は影響あり 9 件などを具体的に出してくれた。対処は人がやり、翌日以降は差分報告に寄せる
自分の端末の「入れっぱなし」を、毎朝チャット 1 通で可視化したい人には、わりと素直な使い方だと思います。
同じようなルーティンを組んでいる方がいれば、情報源の選び方や承認の回し方を教えてください。









