Pythonで自己書き換えについて
ソフトウェアの暗号化技術として自己書き換えというものがある.
自己書き換えを行うことで,マルウェアが自身を書き換えることでパターンマッチングを逃れたりすることも可能である為,マルウェア解析者もこの技術について馴染み深いだろう.
この自己書き換えを行うことで改ざんを修復したり,改ざんを検知することなどが可能である.
しかし,自己書き換えは基本的なソフトウェア開発者においては不要な技術な為デフォルトでは使用できない.例えばWindowsプログラムでは.TextセグメントのWriteFlagを書き換えなければそのプログラムで自己書き換えはできない.
またマイコンではデータメモリとプログラムメモリが混同のノイマン型アーキテクチャのものでしか自己書き換えはできない.
従って自己書き換えは強力な反面,使用できる環境は限定的である.
今回はPythonでの自己書き換えについて調査したのでここにまとめる.
最初に結論を挙げるとPythonで自己書き換えはできない.
Pythonの内部仕様について調べるとどうやらJava Virtual Machineと似たような機構Python Virtual Machineというものが存在し,Pythonで書かれたソースコードをPython Byte Codeという中間言語に変換し,これをPython Virtual Machineが逐次解釈し,実行していくという流れであるようだ.
従ってPython Virtual Machineに渡されるPython Byte Codeを自己書き換えできれば良いということになるがPython Byte CodeはPython上からは書き換えが禁止されている(別の言語からPython Byte Codeを書き換える手法は存在するが,プラットフォームに依存してしまうのでここでは参考程度に挙げるのみとする).
Python Byte Codeの確認はFunction型のオブジェクト Oの次のメンバにアクセスすれば確認できる
O.func_code.co_code
例えば O.func_code.co_code = "\xx\xx\xx"ができれば,Function Oを呼び出した時に実行される処理を変更できるが,書き換え禁止されているので出来ない.
以上のようなことが分かった.
恐らくインタプリタ型の言語では基本的にPython同様自己書き換えは禁止されているのだろうが,どうにかして出来ないか調査した結果活路が見いだせたので,これらの結果をまとめ自己書き換えを用いたソフトウェアの耐タンパー化処理について,いずれどこかの学会等で発表する予定で,もし製品化可能であればそちらも着手していきたいと考えている.
SHODANの研究目的の利用について
SHODANは攻撃に有益なサービスでありますが,元々研究目的の為のサービスなので大学関係者の利用を推奨していますが,これまでSHODANを使用するには使用料が発生して,経理上少々都合が悪いものでした(有料登録はPaypal,APIを使用するにはクレジットカードの登録)
ですが,先日SHODANのTwitterアカウントから大学関係者については無料でアカウントをアップグレードしてくれるという情報がありました.
さっそく私もSHODANのサポートセンターにメールを送信しました.
私のもともとのSHODANのアカウント情報は有料会員登録($50払った状態 検索のフィルタのみが使える)のみだったので,無料会員登録の方も対象なのかはわかりません.
記述した内容としては,登録メールアドレス,SHODANアカウント名(ディスプレイ・ネーム)です.
この際登録メールアドレスがフリーアドレス(学外のメールアカウント)の場合は学内アドレスから送信する必要があります.
数日後に登録メールアドレス(学外アドレス)に以下のメールが来ました.
Twitterでは明確に何がアップグレードされるかは示されていませんでしたが,メールの内容によると
・全てのアドオンが使用できるようになる.(使い方は調査中)
・Export Creditsが100追加(検索結果をエクセルで落とせるクレジット)
・APIプランの変更(プラン的にはビジネス・プランと同じだと思います)
・Shodan Mapsの利用が可能に
Pricingのページを見ると確かにEducational API Planに変わっていました.
またAPIの利用ですが,私の環境ではまだ実行しても
Error: Unable to parse JSON response
が出ます.
ShodanのAPIの利用 - セキュリティ・リサーチにまとめた方法だと2ページ目までは結果は得られなかったのですが,2ページ目が得られるようになっているので,正しくAPIプランは変更されているはずなのですが・・・
APIの利用方法をまとめていきたいと思います.
Industrial Control System
Shodanは生産制御システムについても調査しており専用ページで,調査対象についてまとめている.
https://www.shodan.io/explore/category/industrial-control-systems
現在扱っている生産制御システムは
GE-SRTP,MELSEC-Q,Crimson v3,
HART-IP,PCWorx,OMRON FINS,Codesys,
IEC 60780-5-104,ProConOS,
Modbus,S7,DNP3,
Niagara Fox,BACnet,EtherNet/IP
の計15種類となっている.
各プロトコルのExploreボタンを押すことで,該当する生産制御システムのIPアドレスのリストが出力される(有料会員限定).
しかし,ここで注意しないといけない点がある.
Shodanでは生産制御システムの候補の決定方法として以下の3つがある.
1.portのみが一致
これはModbus,S7,DNP3,Niagara Fox,BACnet,EtherNet/IPが該当する.
例えばBACnetはUDPの47808だが,Shodanでは47808が開いているデバイス=BACnetを使用していると判断されリストに含まれる.
2.portと特定の文字列が一致
これはHART-IP,PCWorx,OMRON FINS,Codesys,IEC 60780-5-104,ProConOSが該当する.
例えばOMRON FINSでは"Response Code"という文字列がデータベースのdata属性に含まれていればリストに含まれる.
3.portとproduct属性が一致
これはGE-SRTP,MELSEC-Q,Crimson v3が該当する.
例えばMELESC-Qは三菱電機の生産制御システムであるが,product属性にmitsubishiが含まれていればリストに含まれる.
product属性の決定方法は不明だが,生産制御システムの特徴的なレスポンスから判別していると推測している.
以上の3つの中で1の検索結果のリストは当てにならない.
例えば183.131.xxx.163は489個ものポートが開いているが,その内ポート1911のレスポンスの内容を見てもNiagara Foxであるとは考えられない.
図1.誤ったNiagara Foxのレスポンス
図2.正しいと思われるNiagara Foxのレスポンス
また2番の生産制御システムも怪しいが500件ほど調査したが,恐らく正しいレスポンスが返ってきたので1%以下の誤差率であるので,信用してもよいかもしれない.
また生産制御システムの他にホームネットワークの自動制御システムについても個人的に調査しているので今後はShodanとは別に色々調べていこうと思う.
Shodan hqとio
Shodanは現在ShodanhqとShodanioの二つのWebページで公開されている
Wayback Machineで確認したところ2014年の7月ごろにShodanioが公開されたように思われる.
これらの二つのShodanで参照しているDBが違うのは注意したい.
APIではWebAPIとShodanAPIを使用することができるが,WebAPIがShodanhqをShodanAPIがShodanioを参照することになる.
またShodanの検索結果をエクスポートする際にクレジットを消費するが,Shodanioのページからは購入することができず,Shodanhqのページから購入することになる(クレジット情報はShodanioに引き継がれる).
このことから今後はクレジットを消費して検索結果をエクスポートするサービスは終了し,APIを使用してユーザが検索結果を取得するのではないかと予想している.
またクレジットを消費して検索結果をエクスポートできるが,これはエクスポートした時点の検索結果しか得られないことに注意されたい.
ShodanのAPIの利用
ShodanのAPIを利用していて気になる点がいくつかあったので纏める.
ShodanのAPIのInstall方法はプログラミング言語ごとに異なるのでShodan Developerを参照する.
またShodanのAPIを利用するには会員登録を行う必要がある.
これは基本登録に$50かかる.
その上ひと月ごとに$19,$99,$499のいずれかを支払う必要がある
各プラン毎に一月当たりのresult数が異なり,
$19では100万件
$99では200万件
$499で無制限という具合である. その他詳しいプラン毎の違いは下記を参照してほしい.
https://developer.shodan.io/billing
利用目的に応じてプランを変えると良いが,$499のプランだと無制限に使用できるので良いが,$19だとそうも言っていられない.
そこで次のプログラムでShodanのAPIの出力を見てからプログラムをチューニングするとよい(月額プランに入る前に試しておく)
*Id,Pass,APIKeyは各々の値を使う
Pythonで書いたが,seleniumが動く環境なら他の言語でも問題ない.
ShodanではShodanAPI越しにアクセスすると月額登録していなければ,BadGateWayが帰ってきてアクセスできないが,上記のプログラムではShodanにログインしているとWebBrowser越しならば検索結果の1ページ目にアクセスできるのを利用している.
これにより100件までの検索結果を得ることができ,出力結果のテストができる.
いずれにしても100件までなので実用上難しいので月額会員になることを推奨する.