Rubyでparse.com経由でPush通知をする
RubyでPush通知を送る
gem
Rubyからはparse-ruby-clientというgemを使うことで楽に使える。しかし、ドキュメントが分かりにくく、使うのに苦労した。
adelevie/parse-ruby-client · GitHub
Gemfile
parse-ruby-clientのmasterブランチにはリリース版に含まれていない変更が多数あるので、Gemfileに以下のように書く必要がある。(12/28時点)
gem 'parse-ruby-client', git: 'https://github.com/adelevie/parse-ruby-client.git'
コード
client = Parse.create :application_id => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', :api_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', # REST API key :quiet => false # quietはオプションでデファルトでfalse push = client.push('Hello') push.where = {} # 全デバイスに送る result = push.save['result'] # {"result"=>true}
Parse.createで認証を通し、client.pushで送るデータをセットし、push.saveで実際に各端末に通知を投げている。
また、上のコードでは文字列を各端末に送信しているが、JSONを送ることもできる。client.pushの引数をハッシュにすればよい。
json = {'test'=>'hello'} push = client.push(json)
Androidで文字列を送信した際は自動で通知画面が生成されるが、JSONを送信したときは通知されないので自分で通知を生成する必要がある。iOSは未確認。
pysandboxの話
Python Advent Calendar 2015の15日目担当の たけまる(@tkmru)です。
今日はSECCON 2015 九州大会で見かけたpysandboxの話をしようと思います。
pysandboxとは
Pythonで作られたsandboxのひとつで、2010年から2013年まで開発が行われていましたが、設計上の問題によりこれ以上発展させることはできないと分かり開発が停止したという歴史をもっています。
GitHub - vstinner/pysandbox: WARNING: pysandbox is BROKEN BY DESIGN, please move to a new sandboxing solution (run python in a sandbox, not the opposite!)
設計の問題とは
pysandboxはCPythonインタプリタの名前空間を制限することで、安全にPythonコードを実行できるsandboxを作ろうと開発されていました。
しかし、CPythonにsandboxをescapeするのに使える関数が多く、sandboxを実装するのに適していないという問題に作者は気付きました。
pysandboxの作者であるVictor StinnerはThe pysandbox project is broken [LWN.net]で、以下のように述べられています。
In my opinion, the compile() vulnerabilty is the proof that it is not possible to put a sandbox in CPython. Blocking access to the open() builtin function and the file type constructor are not enough if unrelated functions can give access indirectly to the file system. Having read access on the file system is a critical vulnerability in pysandbox and modifying CPython to not print the source code line in a traceback is also not acceptable.
「私の見解では、compile()による脆弱性がCPython上にsandboxを置くのは不可能だという証拠となる。無関係な機能が、ファイルシステムに間接的にアクセス権を与えるとすると、内蔵関数 open() とファイル・タイプ コンストラクタへのアクセスをブロックするだけでは十分でない。ファイルシステムへの読み取りアクセスは pysandboxで重大な脆弱性となり、tracebackにコードを表示しないようCPythonを修正することもまた受け入れられない。」
I now agree that putting a sandbox in CPython is the wrong design. There are too many ways to escape the untrusted namespace using the various introspection features of the Python language. To guarantee the [safety] of a security product, the code should be [carefully] audited and the code to review must be as small as possible. Using pysandbox, the "code" is the whole Python core which is a really huge code base. For example, the Python and Objects directories of Python 3.4 contain more than 126,000 lines of C code.
The security of pysandbox is the security of its weakest part. A single bug is enough to escape the whole sandbox.
「私はCPythonの上にsandboxを置くのが間違った設計だというのは正しいと思う。Pythonの機能を使って名前空間をescapeする方法はとても多い。セキュリティ製品の安全性を保証するのに、コードは注意深く監査されるべきで、そのためにコードは出来る限り小さくなければならない。pysandboxの下のコードはものすごく大きいPythonのコアだ。例えば、Python3.4のコードは126,000行を超えるCのコードを含む。pysandboxのセキュリティは最弱のセキュリティとなる。ひとつのバグはsandbox全体をescapeするのに十分だ。」
compile() を使った脆弱性が発見される以前には、__builtins__.__init__、type.__bases__をつかった脆弱性が発見されていました。
また、Pythonインタプリタの外からアプローチすべきだとも述べられています。
To build a secure sandbox, the whole Python process must be put in an external sandbox. There are for example projects using Linux SECCOMP security feature to isolate the Python process.
「セキュアなsandboxを作るためには、Pythonのプロセス全体を外部のsandboxに置く必要があり、例としてLinuxのSECCOMPのPythonプロセスの扱い方が挙げられる。」とのことです。SECCOMPはlinuxカーネルの機能の1つで、どのシステムコールを実行して、どのシステムコールを実行しないかをシステムコールのフィルターとして設定できるというものです。
このような経緯があるため、PythonのsandboxがCTFに出題されるようになったのだと思います。
おわりに
Pythonでsandboxを作るのは難しそうだという話でした。
sandboxは面白そうなので時間をつくって他のものについても調べたり作ったりしたいと思います。
アドカレ投稿遅れてすみませんでした。
CODE BLUEに行ってきた。
CODE BLUE 2015に行ってきた。
世界トップクラスの専門家による情報セキュリティ国際会議「CODE BLUE(コードブルー)」
ああいうカンファレンスは初めてで、スーツ率が意外と高くてビビってたけど、セキュキャンとか勉強会とかで知り合った人が結構いて助かった。
カスペルスキーの学生支援枠で参加したので、カスペルスキー大先生にはめっちゃ感謝です。
昼ごはん豪華だった。
頑張っていきたい。
CTF for ビギナーズ 2015 滋賀 と 奈良
CTF for ビギナーズ 2015 滋賀にはスタッフとして、CTF for ビギナーズ 2015 奈良ではやったことのないA&D形式のCTFをやるということで参加者として参加してきました。
奈良の帰りに同族のたけまる号に会った。
CTF for ビギナーズ 2015 奈良ではビキナーであることを証明してしまったので、SECCON 九州大会でリベンジしたいですね。
setup.pyの操作まとめ
はじめに
setup.pyはつくったモジュールの情報を書いておくファイル。
モジュールの名前やバージョン、作者、ライセンスなどなど。
たまにしか使わないし忘れるのでメモ。
操作いろいろ
モジュールのインストール
python setup.py install
long_descriptionをhtmlにする
long_descriptionとは、PyPIのページで表示されるドキュメント。reSTで書くことが出来る。
python setup.py --long-description | rst2html.py > output.html
readme.rstをじかにrst2html.pyで変換する方が楽。
rst2html.py readme.rst > output.html
pandocを使う方法もある。
pandoc README.rst -s -o output.html
PyPIで配布できる形式に変換
それぞれの特徴は以下の記事で。
Pythonのsource distributionとeggとwheel - 脱力系日記
sdist
python setup.py sdist
egg
python setup.py bdist_egg
win向けインストーラ
python setup.py bdist_wininst
wheel
python setup.py bdist_wheel
文法チェック
python setup.py check
Cuckoo Sandboxを構築した
Cuckoo Sandboxとは
Cuckoo SandboxはOSSのマルウェアの自動解析システムで動的解析に使うことができる。使用にあたっては以下の記事が参考になる。
www.ffri.jp
構築
最初はOS X上に構築しようとしていたが、yaraのエラーなどが出て大変だったのでやめて、以下の記事をみながら、Ubuntu 14.04上に構築した。
http://gwallgofi.com/cuckoo-guide/gwallgofi.com
Windowsは評価版の7を使用した。
Trend Micro CTF Asia Pacific & Japan 2015 Writeup
今回は大和セキュリティのみなさんとわいわい参加してきた。
atnd.org
普段、1人か2人でCTFやってるので大人数でわいわい解くと楽しくてよかった。
オールナイトで参加すると、寝る人にはミーティングルームを1人1部屋使わせてもらえて最高だった。
会場を提供していただいた神戸デジタルラボさん、ありがとうございました。
得点できた問題も一応あったけど、reversingで役にたてなかったので精進していきたい。
misc200
http://ctfquest.trendmicro.co.jp:8181/98cd98a1894676b9/bf9b62aa00e7986fa75ef400f06d57e5/ai_rps.py?hands=にhandsパラメーターとしてRPSを使った文字列をじゃんけんの手として送ると結果が返って来る。30連勝するとフラグが出る。
手を学習するとかいてあったので過学習ねらいで、長いRのあとにSを30個つなげるとかやってみたがだめだった。30連勝は無理ゲーと考えて方向性を変えた。
OSコマンドインジェクションかディレクトリトラバーサルかなと思っていろいろ試してたら、RP/SにしたときPythonのCGIコードが落ちてきた。その中にフラグが書いてあった。URLのパース処理のバグの問題だったようです。
programming200
1 + 1 =という形式で計算式が降ってくるので、結果を返すだけなので簡単。と思いきやローマ数字(ex X, VI)とか英数字(ex eleven, billion)があるのでめんどくさい。ローマ数字の変換はできたけど、英数字でつまづいていたところでチームメイトに相談したら解いてくれた。