Rubyでparse.com経由でPush通知をする

parse.comとは

MBaaS(Mobile Backend as a Service)の一種で、簡単にAndroidIOSにPush通知できるサービス。

https://www.parse.com/

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つで、どのシステムコールを実行して、どのシステムコールを実行しないかをシステムコールのフィルターとして設定できるというものです。

speakerdeck.com

このような経緯があるため、PythonのsandboxがCTFに出題されるようになったのだと思います。

おわりに

Pythonでsandboxを作るのは難しそうだという話でした。
sandboxは面白そうなので時間をつくって他のものについても調べたり作ったりしたいと思います。
アドカレ投稿遅れてすみませんでした。

CODE BLUEに行ってきた。

CODE BLUE 2015に行ってきた。
世界トップクラスの専門家による情報セキュリティ国際会議「CODE BLUE(コードブルー)」

f:id:TAKEmaru:20151028180515j:plain
f:id:TAKEmaru:20151028181232j:plain
f:id:TAKEmaru:20151031135003j:plain

ああいうカンファレンスは初めてで、スーツ率が意外と高くてビビってたけど、セキュキャンとか勉強会とかで知り合った人が結構いて助かった。

カスペルスキーの学生支援枠で参加したので、カスペルスキー大先生にはめっちゃ感謝です。

f:id:TAKEmaru:20151028122101j:plain
f:id:TAKEmaru:20151029115019j:plain

昼ごはん豪華だった。

頑張っていきたい。

CTF for ビギナーズ 2015 滋賀 と 奈良

CTF for ビギナーズ 2015 滋賀にはスタッフとして、CTF for ビギナーズ 2015 奈良ではやったことのないA&D形式のCTFをやるということで参加者として参加してきました。

f:id:TAKEmaru:20151019070802p:plain
f:id:TAKEmaru:20151017120752j:plain
f:id:TAKEmaru:20151017121424j:plain

奈良の帰りに同族のたけまる号に会った。
f:id:TAKEmaru:20151017175605j:plain

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

PyPIに登録

PyPIに上げるためにモジュールを登録する。PyPIに上げることでpipで自作モジュールをいれられるようになる。

python setup.py register

PyPIにupload

つくったモジュールをPyPIに上げる。

python setup.py sdist bdist_wheel upload

長いのでshellのailiasに登録しとくと便利。

alias pypi="python setup.py sdist bdist_wheel upload"

Cuckoo Sandboxを構築した

Cuckoo Sandboxとは

Cuckoo SandboxOSSマルウェアの自動解析システムで動的解析に使うことができる。使用にあたっては以下の記事が参考になる。
www.ffri.jp

構築

最初はOS X上に構築しようとしていたが、yaraのエラーなどが出て大変だったのでやめて、以下の記事をみながら、Ubuntu 14.04上に構築した。
http://gwallgofi.com/cuckoo-guide/gwallgofi.com

Windowsは評価版の7を使用した。

docker

構築にあたり、調査する過程でCuckoo SandboxのDockerfileを見つけた。

github.com

TodoのFigure out how to link to a analysis Windows VMチェックボックスがチェックされていなかったので使うのはやめたが、構築に手間取るツールをdockerでババーンと使えるようになると便利だと思った。

Trend Micro CTF Asia Pacific & Japan 2015 Writeup

今回は大和セキュリティのみなさんとわいわい参加してきた。
atnd.org

普段、1人か2人でCTFやってるので大人数でわいわい解くと楽しくてよかった。
オールナイトで参加すると、寝る人にはミーティングルームを1人1部屋使わせてもらえて最高だった。
会場を提供していただいた神戸デジタルラボさん、ありがとうございました。

f:id:TAKEmaru:20151001164008j:plain

得点できた問題も一応あったけど、reversingで役にたてなかったので精進していきたい。

misc200

http://ctfquest.trendmicro.co.jp:8181/98cd98a1894676b9/bf9b62aa00e7986fa75ef400f06d57e5/ai_rps.py?hands=にhandsパラメーターとしてRPSを使った文字列をじゃんけんの手として送ると結果が返って来る。30連勝するとフラグが出る。

手を学習するとかいてあったので過学習ねらいで、長いRのあとにSを30個つなげるとかやってみたがだめだった。30連勝は無理ゲーと考えて方向性を変えた。

OSコマンドインジェクションかディレクトリトラバーサルかなと思っていろいろ試してたら、RP/SにしたときPythonCGIコードが落ちてきた。その中にフラグが書いてあった。URLのパース処理のバグの問題だったようです。

programming200

1 + 1 =という形式で計算式が降ってくるので、結果を返すだけなので簡単。と思いきやローマ数字(ex X, VI)とか英数字(ex eleven, billion)があるのでめんどくさい。ローマ数字の変換はできたけど、英数字でつまづいていたところでチームメイトに相談したら解いてくれた。