「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
by
PKSHA Technology(パークシャテクノロジー)
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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