急にCSSがくずれた話

大分前に作ったchrome拡張のCSSがくずれていた。

favurl - Chrome Web Store

確認してみたらpreタグに対しての word-wrap: break-word; が効いていなかった。
html - How do I wrap text in a pre tag? - Stack Overflowによると、CSS3ではwhite-space: pre-wrapと書くのがいいらしく、そう書き換えたら直った。

pre {
    white-space: pre-wrap;       /* CSS 3 */
    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    white-space: -pre-wrap;      /* Opera 4-6 */
    white-space: -o-pre-wrap;    /* Opera 7 */
    word-wrap: break-word;       /* Internet Explorer 5.5+ */
}

急に古い書き方が使えなくなったことによって、反映されないCSSが出てきたという話だった。

おもしろ事案だった。

セキュリティ・キャンプ・フォーラム2016で発表してきた

セキュリティ・キャンプ・フォーラムとは

セキュリティ・キャンプの卒業生の同窓会的なイベントです。

「セキュリティ・キャンプフォーラム2016」開催のご案内:IPA 独立行政法人 情報処理推進機構

経緯

今年からセキュリティ・キャンプ・フォーラムにセキュリティ・キャンプアワードというものが併催されることとなり、一次審査を突破するとセキュリティ・キャンプ・フォーラムで発表することになりました。

セキュリティ・キャンプアワード 2016

最初はキャンプの卒業生こわいしアワードとか無理ゲーと思ってたのですが、アワードの締め切り3日前くらいに対象が昨年の卒業生だけであるというのを知り、交通費もらえるしダメ元で応募しとくかと思い応募してみたら、めでたく発表することになりました。

発表

開発中のバイナリエディタ biwxを用いたバイナリ解析について発表してきました。

speakerdeck.com

tkmru/biwx: binary editor for Pythonista.

一発芸てきなあまり中身のないスライドになってしまいましたが、アワードで開発技術賞をいただけました。

感想

カップル講演を見て精神的にダメージを受けたり、ああいう感じのところでしゃべるの初めてだったりしたので、うまく話せるか不安でしたが、それなりにうまく話せて安心しました。

聴衆のスーツ率が異様に高く、完全にスライドのノリを間違えたなと思ってましたが、まあまあ笑いを取れてよかったなと思っています。

次はもっとまともな高度なネタで発表できるように精進していこうと思います。

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"