Malicious Script BlockedでClaude Codeが落ちる — macOSの報告と切り分け
macOSで「Malicious Script Blocked」のダイアログが出てClaude Codeのプロセスが終了する報告が、GitHubのissue #91447にあります。報告内容と、手元で確かめられることをまとめます。
macOSでClaude Codeを使っていると、突然プロセスが終了し、別ウィンドウに「Malicious Script Blocked」というダイアログが出ることがあります。GitHubのissue #91447に、この症状の報告があります。
先に要点を書きます。再現手順は見つかっておらず、原因も公式には特定されていません。ダイアログから承認や除外をする方法も、AppleのガイドやClaude Codeのドキュメントには載っていません。この記事では、報告された内容、macOS側で関係しそうな仕組み、手元で確かめられることを順に説明します。
ダイアログの文面と、起きる症状
報告者によると、Claude Codeのプロセスが強制終了され、別のダイアログが現れます。文面は次のとおりです。
Malicious Script Blocked
A script was blocked because it contains malware. The script did not harm your Mac.
ボタンは「Done」だけだと報告されています。ログに残るのは Process killed の一言で、エラーの詳細は出ません。
issueのラベルは bug、platform:macos、area:packaging、area:security です。issueはopenのままで、Anthropic側のコメントや修正の記載はありません。
報告された3つの場面とバージョン
報告者は、同じ症状を数回経験したと書いています。いずれも変わった作業ではありません。
| 場面 | 何をしていたか |
|---|---|
| 計画づくり | 何をしていたかコードを書く前に、ドキュメントや対象ファイルを読んでいた |
| PR対応 | 何をしていたかレビュアーの指摘を読み、コードとコメントで返していた |
| 調査作業 | 何をしていたかドメイン名の統計を集め、whoisを実行していた |
バージョンは次のとおりです。
| 項目 | 報告内容 |
|---|---|
| 最後に問題なく動いていた版 | 報告内容2.1.240前後 |
| 最初の発生 | 報告内容2.1.246前後(それより少し前の可能性あり) |
| 直近の発生 | 報告内容2.1.252 |
| 報告時点で更新済みの版 | 報告内容2.1.258 |
| 環境 | 報告内容macOS、Terminal.app、モデルはSonnet(既定) |
報告者は「過去のバージョンでは起きなかったので退行ではないか」と見ています。一方で「ここ1週間に数十回のセッションを走らせ、複数を並行させた日もあるが、大半は無事だった」とも書いています。発生は偶然に近く、特定のコマンドと結びつけられていません。
ほかの報告者はどれくらいいるか
コメントは6件あります。同じユーザーの4件は、3件がissueを閉じさせないための「noise comment」で、1件が高評価を勧める返信です。残りは次の2件です。
- 別のユーザーが「同じバージョンで同じ症状が出ている」と書いた
- もう1人が「自分にも起きている」と書いた
つまり、同じ症状を書き込んだのは2人です。高評価を勧める返信は、コメントを重ねるより高評価(upvote)のほうが注目を集めやすいという内容です。広く出ている不具合とは言えず、かといって1人だけの環境の問題とも言い切れない規模です。
macOSのどの仕組みが動いているのか
issueには、ダイアログを出したのがmacOSのどの機能かは書かれていません。そこでAppleのセキュリティガイドを見ると、関係しそうな層が1つあります。
Appleによると、macOSには XProtect と呼ぶ組み込みのマルウェア対策があります。署名(YARA)ベースで既知のマルウェアを検出し、実行を止めます。検出するとマルウェアをゴミ箱へ移し、Finderで知らせる、という流れです。XProtectは、アプリの初回起動時、ファイルシステム上での変更時、署名の更新時に確認します。
さらに、既知の署名に頼らず、振る舞い分析で未知のマルウェアを見つけるエンジンも含まれると書かれています。
ここで言えることは限られます。
- ガイドにダイアログの文面「Malicious Script Blocked」そのものの記載はない
- ガイドが説明する対象は、主にアプリ(実行ファイル)で、スクリプトの扱いは明記されていない
- したがって「このダイアログはXProtectによる」と断定する材料は、公式の資料にはない
「macOS側のマルウェア防御が反応した」と読むのが自然ではあります。ただし、これは文面からの推測です。何に反応したのかは、報告者にも分かっていません。
報告者の仮説をどう扱うか
報告者は、Claude自身に原因を尋ねたと書いています。返ってきたのは「ヒアドキュメント内のPythonスクリプトに反応したのかもしれない」という推測でした。
これはモデルの推測にとどまり、検証されていません。3つの場面を見ても、どれもPythonのヒアドキュメントを使ったとは限りません。この仮説を前提にすると、別の原因を見落とします。
手元のClaude Codeが正規のものか確かめる
最初に確かめたいのは、実行しているバイナリが改変されていないかです。公式のドキュメントによると、macOS向けのバイナリは「Anthropic PBC」の署名が付き、Appleの公証(notarization)を受けています。署名は codesign で検証できます。
command -v claude
claude --version
codesign --verify --verbose "$(command -v claude)"claude が別のラッパー経由で呼ばれている場合は、実体のパスを指定します。署名の検証が通れば、本体が差し替えられている可能性は下がります。通らないときは、公式の手順で入れ直してください。
インストール全体の健全性は、Claude Code内の /doctor で調べられます。公式のトラブルシューティングによると、インストール、設定、拡張、コンテキストの使用状況を自動で点検し、直せるものは確認のうえで直します。claude が起動しない場合は、シェルから claude doctor を実行します。
次に起きたときのために残しておく記録
再現手順がない不具合は、発生時の情報が足りないと動きません。次に起きたときに残すと役立つのは、次の項目です。
- ダイアログが出た時刻(秒単位まで)
- その直前にClaude Codeが実行していたコマンドや、読んでいたファイル
claude --versionの出力とmacOSのバージョン- 同時に動かしていたセッションの数
- 使っていたターミナルアプリ
公式の案内では、Claude Code内の /feedback で問題を直接Anthropicに報告できます。issue #91447への追記も、2のような具体的な状況なら情報になります。「同じです」だけのコメントより、コマンドの種類や頻度のほうが原因の絞り込みに使えます。
ダイアログから承認や除外はできるか
報告されているダイアログのボタンは「Done」だけです。「許可する」「このファイルを除外する」といった選択肢は、報告された画面にはありません。
このダイアログに対応する除外の手順は、AppleのガイドにもClaude Codeのドキュメントにも載っていません。Claude Codeのドキュメントにも、この動作を避けるための設定項目は載っていません。
そのため現実的な手段は、署名を確かめ、記録を残し、バージョンを更新して様子を見ることに限られます。報告者の環境では、2.1.258に更新した後の発生は書かれていません。ただし、それが解消を意味するかは分かりません。
Appleの多層防御のなかで、止める側はどこか
Appleのガイドは、macOSのマルウェア対策を3つの層で説明しています。症状がどの層に近いかを考える材料になります。
| 層 | 役割 | 働くタイミング |
|---|---|---|
| Gatekeeper | 役割公証(notarization)を受けていないアプリの起動を防ぐ | 働くタイミング起動時 |
| 公証の失効 | 役割公証済みでも、悪意があると分かったアプリの起動を止める | 働くタイミングバックグラウンドで頻繁に確認 |
| XProtect | 役割署名と振る舞いで検出し、実行を止めて除去する | 働くタイミング初回起動、変更、署名の更新 |
公証の失効情報は、XProtectの署名更新よりも頻繁に確認されるとAppleは書いています。つまり、昨日まで問題なく動いたものが、ある日突然止まる経路が複数あります。「バージョンを変えていないのに起きた」ことは、それ自体では原因の手がかりになりません。
Claude Codeのバイナリは公証済みなので、通常はGatekeeperの段階では止まらないはずです。issueの症状は起動時ではなく、作業の途中で起きています。この点は、起動時に働く層よりも、実行中の挙動を見る層に近い動きです。ただし、これは症状の時系列からの読みで、どの層が動いたかの裏付けではありません。
終了の仕方から見分ける材料
プロセスが何かに強制終了されたとき、シェルには終了コードが残ります。Claude Codeのインストール手順のドキュメントによると、macOSで終了コード137はSIGKILLを受けた場合です。LinuxではメモリーのOOM killerが典型ですが、macOSでは別の理由もありえます。
issueのログは Process killed の一言だけで、終了コードは書かれていません。次に起きたときは、ターミナルに残る出力を確かめてください。ダイアログが同時に出ていれば、メモリー不足ではなく、macOSの防御機能による終了だと判断しやすくなります。
管理されたMacで確認できること
会社が管理するMacでは、セキュリティ製品が検出を記録していることがあります。AppleのEndpoint Security APIは、XProtectが検出した具体的なファイルと、対応する署名を取得できると説明されています。
macOS 15以降では、ユーザーがGatekeeperを回避してプログラムを実行したときのイベントも、同じAPIで受け取れます。これらのイベントは、macOSに組み込みのユーティリティ eslogger でも確認できるとAppleは説明しています。個人のMacでも、Gatekeeper回避の記録を自分で調べる入口になります。
自分の環境で検出が記録されているかは、情報システム部門に聞くのが早い方法です。どのファイルが対象になったかが分かれば、issueに追記する情報としても価値が高くなります。
似た見た目の別の症状と切り分ける
macOSでClaude Codeが急に止まる、動かなくなる話は、原因がまったく別のものがあります。見分けるときの目安を並べます。
| 症状 | 見分け方 | 参照 |
|---|---|---|
| 「Malicious Script Blocked」が出てプロセスが終了 | 見分け方macOSのダイアログが別ウィンドウで出る | 参照この記事 |
| heredocの書き込みで固まり、ファイルが空になる | 見分け方終了せず、約500バイト超の書き込みで待たされる | 参照heredocが固まる原因 |
| /loginは成功するのに認証が残らない | 見分け方macOS 26で、トークンが保存されない | 参照macOS 26の/login |
open や osascript が -600で失敗 | 見分け方sandbox内のAppleEventsが原因 | 参照sandboxの-600エラー |
「Malicious Script Blocked」はダイアログが出る点で、ほかと区別できます。ダイアログが出ずに止まるなら、この記事の症状ではありません。
まとめ
「Malicious Script Blocked」でClaude Codeが終了する不具合は、issue #91447に報告されたもので、openのままです。発生は不定期で、再現手順がなく、macOSのどの機能が反応したかも確認できていません。
手元でできるのは、codesign --verify で署名を確かめること、/doctor で環境を点検すること、次に起きたときの時刻とコマンドを記録することです。続報は、issueの更新で確認できます。