Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026

PyCon JP 2026(広島)の発表資料です。

Pythonで開発したアプリケーションを顧客環境に納品する際、コードが相手の手元に渡ります。そこにAIのコア部分など知財が含まれる場合、どう守るか。選択肢のひとつが、動作を変えずに人が理解するコストだけを上げる「難読化」です。

難読化ツール PyArmor を題材に、実際どこまで守れるのかを扱っています。まず PyArmor の基本的な使い方と、生成されるランタイムの役割を紹介します。次に CPython がコードを実行する仕組み(コードオブジェクト、module.__dict__、co_code)を追いながら、デフォルト設定の難読化ファイルを import しただけで、クラス名・関数名・グローバル変数・docstring・文字列定数がそのまま読み取れてしまう様子と、その理由を解説しています。

そのうえで解析難易度を上げる mix-str / RFT / BCC / --private・--restrict といったオプションを紹介し、Claude Code(Opus 5)に難読化ファイルとランタイムだけを渡して元コードをどこまで復元できるかを検証しました。デフォルト難読化ではほぼ復元される一方、オプションを組み合わせると復元できなくなること、ただしロジックが単純な場合は入出力の観察だけで再現されてしまうことを示しています。

最後に、アプリ全体・Webフレームワーク・API層とロジック層といったケースごとに、どのオプションをどう選ぶかの判断軸を共有しています。時間をかければある程度は理解されうる、と認識した上で設計することが出発点です。

More Decks by PKSHA Technology(パークシャテクノロジー)

Other Decks in Programming

Transcript

  1. 自己紹介 山本隼輔 Shunsuke Yamamoto 2026 年 4 月に PKSHA Technology

    へ新卒入社 物流の輸送可否をAIで判定するシステム開発に従事 PyCon JP は今回が初登壇 大学院時代は自然言語処理(NLP)の研究に取り組 み、NLPIR 2025にてBest Student Paper賞およびBest Presentation賞を受賞 趣味はピアノとボルダリング © PKSHA Technology All rights reserved. 2
  2. はじめに PKSHA(パークシャ)ではクライアント向け AI ソリューションを構築 自社で環境を構築 顧客環境に構築 • ほとんどの案件 • コードは秘匿される

    • セキュリティ要件などで必要 • コードが顧客の手元に渡る • AI のコア部分(知財)が含まれる ことがある © PKSHA Technology All rights reserved. 10
  3. はじめに PKSHA(パークシャ)ではクライアント向け AI ソリューションを構築 自社で環境を構築 顧客環境に構築 • ほとんどの案件 • コードは秘匿される

    • セキュリティ要件などで必要 • コードが顧客の手元に渡る • AI のコア部分(知財)が含まれる ことがある 難読化を使ってコードを秘匿 © PKSHA Technology All rights reserved. 11
  4. 実際にどんな値が取得できるか 実行環境: • • • • PyArmor 9.2.5 / CI

    ライセンス Python 3.13 OS linux.aarch64(Docker) PC: Apple M4 Pro © PKSHA Technology All rights reserved. 28
  5. なぜ取れてしまったのか import sample は、「空の module object を作り、code object を実行して module.__dict__

    を名前で埋める」処理 実行する際、必ず元のコードオブジェクトに戻す必要があり、どこかのタイ ミングでメモリ上に平文が現れる © PKSHA Technology All rights reserved. 35
  6. RFT • 関数名、クラスメソッド名、import名などを、無意味な名前に変える • 変えないもの • • • • 関数定義の引数名

    呼び出し側のキーワード引数名 __all__ に載っているもの etc.. © PKSHA Technology All rights reserved. 43
  7. 解析難易度を上げる各種オプション --private • 難読化されたファイルにある値(クラスの属性など)を、平文スクリプ トや Python インタプリタから見えなくする • import 自体はできるが、各値にアクセスできない

    ※アクセスしようとすると、「RuntimeError: unauthorized use of script 」 --restrict • --private を含んだ上で、パッケージ内の __init__.py 以外は平文スクリ プトから import すら通らなくさせる © PKSHA Technology All rights reserved. 49
  8. 2章のまとめ • デフォルトの難読化では、名前も値も簡単に取れてしまう • 各種オプションで解析難易度をあげられる • RFT, BCC, mix-str, --private

    など • 時間をかければ解析しうる(gdbなど) • 各種オプションによって動かなくなるものがある • 事前の動作確認は必須 © PKSHA Technology All rights reserved. 52
  9. 実用時の判断軸 基本的なアプリケーションやパッケージ: • BCCとRFTが使えるならそれが一番良い • --enable-rft • --enable-bcc • --mix-str

    with filter RFTで名前が変えられて、BCCによってco_codeが解析できなくなる 使えなければ他のオプションと組み替えたりすると良い 参考:https://pyarmor.readthedocs.io/en/latest/how-to/security.html © PKSHA Technology All rights reserved. 64
  10. 実用時の判断軸 DjangoなどのWebサービスで難読化を用いる場合: • 公式ページにおすすめのオプションが載っている! • --enable-rft • --obf-code 0 •

    --obf-module 0 • --mix-str with filter 公式ページによると、Web Requestだとスピードを優先して、一部難読化し ないという手段もある 参考:https://pyarmor.readthedocs.io/en/latest/how-to/security.html © PKSHA Technology All rights reserved. 65
  11. 実用時の判断軸 API 層とビジネスロジックが分かれているとき: • レイヤごとに強度を変えるのが良いか • API 層(FastAPI など):inspectに依存するので --private

    は使えない • 公式のDjangoの例と同じやつが使えるかも • ロジック層:RFT、BCC、mix-str、--privateを使えたら使う • でも、pandasとかその他依存ライブラリが動かなければ別の手段と組み替えたり © PKSHA Technology All rights reserved. 66
  12. まとめ 難読化は、解析しにくくする技術 Pyarmor で .py を難読化できる 解析難易度を上げるオプションも複数存在する • mix-str /

    RFT / BCC、--privateなど 時間をかければある程度は理解されうる、と認識した上で設計する © PKSHA Technology All rights reserved. 69