Slide 1

Slide 1 text

Pycon JP 2026 AI時代、配布するPythonコードをどう守 るか: 難読化の実験と判断軸 山本隼輔 © PKSHA Technology All rights reserved. 1

Slide 2

Slide 2 text

自己紹介 山本隼輔 Shunsuke Yamamoto 2026 年 4 月に PKSHA Technology へ新卒入社 物流の輸送可否をAIで判定するシステム開発に従事 PyCon JP は今回が初登壇 大学院時代は自然言語処理(NLP)の研究に取り組 み、NLPIR 2025にてBest Student Paper賞およびBest Presentation賞を受賞 趣味はピアノとボルダリング © PKSHA Technology All rights reserved. 2

Slide 3

Slide 3 text

はじめに 「難読化」って聞いた ことありますか? © PKSHA Technology All rights reserved. 3

Slide 4

Slide 4 text

難読化とは 「動作は変えずに、人が理解するコストだけを上げる変換」 目的は簡単には解析できない状態にすること 鍵がなければ使うことすらできない「暗号化」とは異なる © PKSHA Technology All rights reserved. 4

Slide 5

Slide 5 text

はじめに 「難読化したファイルの見た目」を紹介 本発表で扱う難読化は次のようなもの © PKSHA Technology All rights reserved. 5

Slide 6

Slide 6 text

はじめに 難読化 全く見た目が異なる © PKSHA Technology All rights reserved. 6

Slide 7

Slide 7 text

はじめに ではどんな時に使うものなのか © PKSHA Technology All rights reserved. 7

Slide 8

Slide 8 text

はじめに Webアプリを提供する方法: • サービスとして提供(SaaS、アプリなど) • 納品して顧客環境で提供する(受託など) © PKSHA Technology All rights reserved. 8

Slide 9

Slide 9 text

はじめに Webアプリを提供する方法: • サービスとして提供(SaaS、アプリなど) • 納品して顧客環境で提供する(受託など) • 難読化が必要になるのは、この時 • かつ、守りたい知財がコードに含まれている場合 © PKSHA Technology All rights reserved. 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

自分が経験したケース クライアントのGCP環境にシステム構築しなければならないが、アプリケー ションコード中に知財となるものが含まれ、秘匿したかった © PKSHA Technology All rights reserved. 12

Slide 13

Slide 13 text

本発表の背景 難読化ツールを使ってみたところ、実は解析すると色々な情報を取れてしま うことが分かった • AI時代、難読化でコードをどこまで守れるのか気になった • すぐに解析できてしまう点と、解析が難しい点の境界はどこか • 難読化を使用する際のベストプラクティスは何か © PKSHA Technology All rights reserved. 13

Slide 14

Slide 14 text

本発表の目的 • 難読化という技術を知ってもらう • pythonが実行される仕組みを少し知ってもらう(CPython) • 実際に使う際に知っておくべきことを伝える • 具体的なユースケースをいくつか紹介する © PKSHA Technology All rights reserved. 14

Slide 15

Slide 15 text

1. Pyarmor(難読化ツール)とその使い方 AGENDA 2. 難読化の仕組みと各種オプション 3. AIはどこまで解析できるのか 4. 実用時の判断軸 © PKSHA Technology All rights reserved. 15

Slide 16

Slide 16 text

1 Pyarmorとその使い方 © PKSHA Technology All rights reserved. 16

Slide 17

Slide 17 text

題材として使うsample.py © PKSHA Technology All rights reserved. 17

Slide 18

Slide 18 text

Pyarmorは数行で利用可能 © PKSHA Technology All rights reserved. 18

Slide 19

Slide 19 text

Pyarmorは数行で利用可能 難読化 © PKSHA Technology All rights reserved. 19

Slide 20

Slide 20 text

Pyarmorは数行で利用可能 pyarmor_runtime.so: 難読化されたファイルを動かしている © PKSHA Technology All rights reserved. 20

Slide 21

Slide 21 text

Pyarmorは数行で利用可能 実行時: 実行時はpyarmor_runtimeも一緒に 実行側では Pyarmor のインストールも ライセンス検証も不要 © PKSHA Technology All rights reserved. 21

Slide 22

Slide 22 text

2 難読化の仕組みと各種オプション © PKSHA Technology All rights reserved. 22

Slide 23

Slide 23 text

おさらい • 難読化とは、動作を変えずに、人が理解するコストだけを上げること • 顧客の環境に .py が置かれ、その中に知財が含まれる場合に使う © PKSHA Technology All rights reserved. 23

Slide 24

Slide 24 text

pythonが実行される仕組みを解説 どこまで情報がバレるのか __pycache__ / .pyc ↑を含む © PKSHA Technology All rights reserved. 24

Slide 25

Slide 25 text

pythonが実行される仕組みを解説 © PKSHA Technology All rights reserved. 25

Slide 26

Slide 26 text

pythonが実行される仕組みを解説 © PKSHA Technology All rights reserved. 26

Slide 27

Slide 27 text

難読化ファイルのバイナリ 難読化されたファイルにはコードオブジェクトが含まれている ※コードオブジェクトが独自形式のバイナリになり、実行時には元に戻され ることで動いている © PKSHA Technology All rights reserved. 27

Slide 28

Slide 28 text

実際にどんな値が取得できるか 実行環境: • • • • PyArmor 9.2.5 / CI ライセンス Python 3.13 OS linux.aarch64(Docker) PC: Apple M4 Pro © PKSHA Technology All rights reserved. 28

Slide 29

Slide 29 text

解析準備 • 難読化したsample.py を解析するファイル → 1. モジュール直下の名前と値を出す 2. 関数の中身(co_consts)を覗く 3. クラス属性とメソッドの中身を覗く © PKSHA Technology All rights reserved. 29

Slide 30

Slide 30 text

解析結果(省略あり) © PKSHA Technology All rights reserved. 30

Slide 31

Slide 31 text

解析結果(省略あり) © PKSHA Technology All rights reserved. 31

Slide 32

Slide 32 text

色々な情報が取れる 一例 • • • • クラス名 関数名 グローバル変数 docstring などなど © PKSHA Technology All rights reserved. 32

Slide 33

Slide 33 text

難読化する前のsample.py © PKSHA Technology All rights reserved. 33

Slide 34

Slide 34 text

難読化する前のsample.py © PKSHA Technology All rights reserved. 34

Slide 35

Slide 35 text

なぜ取れてしまったのか import sample は、「空の module object を作り、code object を実行して module.__dict__ を名前で埋める」処理 実行する際、必ず元のコードオブジェクトに戻す必要があり、どこかのタイ ミングでメモリ上に平文が現れる © PKSHA Technology All rights reserved. 35

Slide 36

Slide 36 text

module.__dict__ の中身 © PKSHA Technology All rights reserved. 36

Slide 37

Slide 37 text

module.__dict__ の中身 © PKSHA Technology All rights reserved. 37

Slide 38

Slide 38 text

関数(__code__)中身 • co_codeはimportしても難 読化されたままで読めない © PKSHA Technology All rights reserved. 38

Slide 39

Slide 39 text

解析難易度を上げる各種オプション ここまで、Pyarmorで難読化をしたとしても、かなりの情報が取れてしまう ことが分かりました。 © PKSHA Technology All rights reserved. 39

Slide 40

Slide 40 text

解析難易度を上げる各種オプション Pyarmorには引数や設定が色々あり、解析難易度をあげられる選択肢が存在 その中のいくつかを紹介します • • • • mix-str RFT BCC private / restrict © PKSHA Technology All rights reserved. 40

Slide 41

Slide 41 text

mix-str • 文字列定数を暗号化する。既定では長さ8文字以上の文字列が対象 • 実行された瞬間からメモリから消えるまで、暗号化されたまま! • 実際importして覗き込んでも、文字列は暗号化されていて読めない © PKSHA Technology All rights reserved. 41

Slide 42

Slide 42 text

mix-str • 8文字以上の文字列が暗号化されて読めない • 以下は解析実行した際の、出力の一部 デフォルト難読化 mix-str © PKSHA Technology All rights reserved. 42

Slide 43

Slide 43 text

RFT • 関数名、クラスメソッド名、import名などを、無意味な名前に変える • 変えないもの • • • • 関数定義の引数名 呼び出し側のキーワード引数名 __all__ に載っているもの etc.. © PKSHA Technology All rights reserved. 43

Slide 44

Slide 44 text

RFT • デフォルトだと露出していたクラス名なども匿名化された状態で実行 • ※RFTでは文字列定数までは変えないので、mix-strと併用すると良い デフォルト難読化 RFT © PKSHA Technology All rights reserved. 44

Slide 45

Slide 45 text

BCC • 関数・メソッドを等価な C 関数に変換し、機械語まで落として埋め込む • co_codeを機械語に変換するので、元の命令列が残らない © PKSHA Technology All rights reserved. 45

Slide 46

Slide 46 text

BCC © PKSHA Technology All rights reserved. 46

Slide 47

Slide 47 text

BCC 直接Cで実行 © PKSHA Technology All rights reserved. 47

Slide 48

Slide 48 text

解析難易度を上げる各種オプション 解析するファイルでは、sample.pyを importして、その属性を読むことで 値を読んでいた Pyarmorには上記を防ぐオプションが 存在する © PKSHA Technology All rights reserved. 48

Slide 49

Slide 49 text

解析難易度を上げる各種オプション --private • 難読化されたファイルにある値(クラスの属性など)を、平文スクリプ トや Python インタプリタから見えなくする • import 自体はできるが、各値にアクセスできない ※アクセスしようとすると、「RuntimeError: unauthorized use of script 」 --restrict • --private を含んだ上で、パッケージ内の __init__.py 以外は平文スクリ プトから import すら通らなくさせる © PKSHA Technology All rights reserved. 49

Slide 50

Slide 50 text

注意点: 難読化すると、動かなくなるものがある (公式でも、何が実際に動かなくなるか全ては明文化されていない) 例: • inspect の大半が壊れる • pandas や cherrypyなども壊れることがある 事前の動作確認は大切 © PKSHA Technology All rights reserved. 50

Slide 51

Slide 51 text

注意点: 時間をかければ解析しうる • set_traceを使った解析 • gdbを使ったメモリダンプ などなど © PKSHA Technology All rights reserved. 51

Slide 52

Slide 52 text

2章のまとめ • デフォルトの難読化では、名前も値も簡単に取れてしまう • 各種オプションで解析難易度をあげられる • RFT, BCC, mix-str, --private など • 時間をかければ解析しうる(gdbなど) • 各種オプションによって動かなくなるものがある • 事前の動作確認は必須 © PKSHA Technology All rights reserved. 52

Slide 53

Slide 53 text

3 AIはどこまで解析できるのか © PKSHA Technology All rights reserved. 53

Slide 54

Slide 54 text

Opus5.0による解析 AIに「難読化されたファイル」と「ランタイム」だけを渡して、どこまで解 析できるのか Claude Code(Opus 5)を利用して実験 © PKSHA Technology All rights reserved. 54

Slide 55

Slide 55 text

Opus5.0による解析 元ファイルをどこまで復元できるのかを、二つのパターンで実験 • デフォルト難読化のみを実行した場合 • RFT, BCC, mix-str, --private を使って実行した場合 © PKSHA Technology All rights reserved. 55

Slide 56

Slide 56 text

Opus5.0による解析 デフォルト難読化のみを実行した場合 元コード AIが復元したコード © PKSHA Technology All rights reserved. 56

Slide 57

Slide 57 text

Opus5.0による解析 RFT, BCC, mix-str, --privateを使った難読化を実行した場合 元コード AIは復元できず 関数名、定数、変数名などを解 析することができなかった © PKSHA Technology All rights reserved. 57

Slide 58

Slide 58 text

Opus5.0による解析 デフォルト難読化だと、定数などが取れて大枠復元できることは分かった 関数などに書いてあるロジックは解析されるのかが気になる © PKSHA Technology All rights reserved. 58

Slide 59

Slide 59 text

Opus5.0による解析 自分なりのハッシュ関数を難読化して、AIがそれを復元できるか (RFT, BCC, mix-str, --privateを使った難読化) 簡単なハッシュ関数 複雑なハッシュ関数 © PKSHA Technology All rights reserved. 59

Slide 60

Slide 60 text

Opus5.0による解析 簡単なハッシュ関数は、ロジックが解析された 簡単なハッシュ関数 ← 何回か入出力試すだけで復 元できてしまう AIが復元した関数 out = x % 251だとAIが理解 ← 復元の様子をかく © PKSHA Technology All rights reserved. 60

Slide 61

Slide 61 text

Opus5.0による解析 一方、複雑なハッシュ関数はほぼ解析されなかった 複雑なハッシュ関数 解析できなかった理由 • --privateによって、定数へ のアクセスはできない • BCCによって、対応する関 数が等価な C 関数に変換さ れ、機械語までコンパイル される © PKSHA Technology All rights reserved. 61

Slide 62

Slide 62 text

4 実用時の判断軸 © PKSHA Technology All rights reserved. 62

Slide 63

Slide 63 text

その前に少しおさらい • 背景:先方環境への構築や納品時に一部秘匿したい • 知財部分の解析や流用の禁止を契約として握る(これはとても大切) • ただ、時間をかければ解析できてしまうので、防ぐためにやる • 動作確認は確実に行うべき • 具体的な自分なりの判断軸を紹介していきます © PKSHA Technology All rights reserved. 63

Slide 64

Slide 64 text

実用時の判断軸 基本的なアプリケーションやパッケージ: • 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

Slide 65

Slide 65 text

実用時の判断軸 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

Slide 66

Slide 66 text

実用時の判断軸 API 層とビジネスロジックが分かれているとき: • レイヤごとに強度を変えるのが良いか • API 層(FastAPI など):inspectに依存するので --private は使えない • 公式のDjangoの例と同じやつが使えるかも • ロジック層:RFT、BCC、mix-str、--privateを使えたら使う • でも、pandasとかその他依存ライブラリが動かなければ別の手段と組み替えたり © PKSHA Technology All rights reserved. 66

Slide 67

Slide 67 text

実用時の判断軸 生成AIのプロンプトは守れるか: • 難読化によってファイルから直接見ることはできなくなる • mix_strオプションや--privateで、直接importして読むとかは防げる © PKSHA Technology All rights reserved. 67

Slide 68

Slide 68 text

まとめ © PKSHA Technology All rights reserved. 68

Slide 69

Slide 69 text

まとめ 難読化は、解析しにくくする技術 Pyarmor で .py を難読化できる 解析難易度を上げるオプションも複数存在する • mix-str / RFT / BCC、--privateなど 時間をかければある程度は理解されうる、と認識した上で設計する © PKSHA Technology All rights reserved. 69

Slide 70

Slide 70 text

Thank you for listening ご質問があればぜひ! もしくはAsk the Speakerでも! © PKSHA Technology All rights reserved. 70