導入
Gradioの素晴らしいハンズオン教材を動かしていたら、
「マルウェア検知されました」→「情シスから警告」→「はい、報告書確定です」
という地獄コンボを食らいました。
調べてみたら gradio.launch(share=True)
の裏側で Fast Reverse Proxy(FRP)を確立するために、勝手に .exe
ファイルをダウンロード&実行していたんですね。
どうりでWindows Defenderさんがシュバってくるわけです。
というわけで今回は、Gradioのshare機能の正体となぜ警告されるのか、
そして回避策(share=False
)の推奨理由をまとめます。
TL;DR(この記事でわかること)
- Gradioで
share=True
にすると、外部からアクセス可能な状態になる - その裏では
.exe
実行ファイルがダウンロード&実行されている - これがセキュリティソフトに「マルウェア疑惑」と誤判定される可能性がある
- チーム開発や企業環境では、
share=False
にしておくのが安全
対象読者
- Gradioを使ってローカルアプリを外部に公開しようとしている人
- 社内PCや情シス管理下の端末でGradioを動かしている人
- 「とりあえずハンズオンを写経して怒られた」タイプのエンジニア
gradioをshare=Trueで起動すると起こること
Fast Reverse Proxyという技術を使用して、
ローカルで起動しているgradioアプリケーションをパブリックな環境から使用できるようになります。
正確には、gradio起動時に発行されるURL(例:https://xxxxx.gradio.live/)
からの操作をshareサーバー(HuggingFace管理)を経由して
ローカル端末に伝搬する仕組みです
具体的には、以下の図のようなイメージで動作します。
https://www.gradio.app/guides/understanding-gradio-share-links
実は .exe
が動いている:Fast Reverse Proxy の裏側
実はFast Reverse Proxyを確立するためにgradioソース内で実行ファイルをDLして、実行しているためWindows Defenderにマルウェア判定されてしまいます。
Fast Reverse Proxyを確立するために呼ばれる実行ファイル
問題のコード:
gradio/tunneling.py#L112
具体的な実行ファイルとしては、以下になります。
{省略..}/gradio/frpc/{原本ファイル名}_v{原本バージョン}
例えば、情シスから
「マルウェアと思わしき実行ファイルを検知した。実行ファイルはこちら。」
と言われるファイルは以下のようになります。
{省略..}/gradio/frpc/frpc_windows_amd64_v0.3
大元の実行ファイルは、ライブラリをインストールした時点では入っておらず
gradioでshare=True初回起動時に
https://cdn-media.huggingface.co/
から提供されているのでバイナリをダウンロードしてきます。
https://www.gradio.app/guides/understanding-gradio-share-links#frp-client
危険性
マルウェアかという観点
gradioは生成AI業界でdemoアプリ開発用とでの利用実績が多数ある著名OSSです。
よって、悪意の混入には細心の注意を払っているため
frp確立に動作した実行ファイルはマルウェアではないと言えます。
🔳 マルウェアの定義
悪意のあるソフトウェア(Malicious Software)の総称で、コンピューターやその利用者に危害を及ぼす目的で作成されたプログラム
セキュリティ観点
マルウェアではないものの、外部から自身の端末を間接的に使用させるため以下のリスクが挙げられます。
🔳 狭義
gradio実行時のmainファイルで許可した操作が外部で使用可能になります。
gradio UI上から可能な操作だけでなく、
mainファイル内のdef全てがAPIとして実行可能になっているため、
defで実行可能な操作が全てできてしまう状態になります。
🔳 広義
脆弱性を突かれた場合、狭義のリスク範囲内で収まらない可能性もあります。
外部からローカル端末リソースを使用可能にさせる状態であるため、
実行前と比べ、実行後は ”セキュリティーリスクがとても高い” 状態であると言えます。
【ログの提出による影響範囲証明について】
発行された公開URLを知らないと誰もコールできないわけなので
数分であれば誰もリクエストしてこない可能性が高いです。
しかし、基本的にgradio側でアクセスログを意図して出力していない限りは
外部からのアクセスが来たかどうか明確なログは残りません。
ログ提出を求められても死人の証明になるので、
起動したウィルスソフトの前後ログを確認して後はわからないというしかないです。。。
私の場合は、幸いwindows defenderのログにfrp起動を防いでくれた記録があったので影響なしと報告書が書けました。。。
windows defenderのログ参照方法は以下がわかりやすいです。
おわりに:あなたも他人事じゃないかも
Gradioは神ライブラリですが、企業内やチーム開発ではほんの一行の share=True
でセキュリティリスクが爆誕するという罠があります。
他にもこの事象に引っかかる人がいるはずなので、
ぜひこのQiitaを拡散してください 🙇♂️
X(旧Twitter)でもこんな話をよくつぶやいてるので、フォローも歓迎です!