タグ

ブックマーク / blog.ohgaki.net (120)

  • ホスト名バリデーションのやり方

    (Last Updated On: 2018年8月13日)徳丸さんのブログで私のブログ「GHOSTを使って攻撃できるケース」にコメントがあったようなので、好ましいホスト名バリデーションの方法を書いておきます。 特定の低レベルAPIのバグが10年ほど前に書いたのコードで対応できていない、と議論するのもどうかと思いますがしっかりチェックする場合の例を書いておきます。 そもそもホスト名の仕様はどうなっているのか? 入力バリデーションを行うには仕様を理解する必要があります。ホスト名の仕様は幾つかのRFCで言及されています。例えば、RFC 2181の11. Name syntaxには That one restriction relates to the length of the label and the full name. The length of any one label is li

    ホスト名バリデーションのやり方
  • PHP7の新しいセッションモジュールの性能

    (Last Updated On: 2018年8月13日)PHP7用の新しいセッションモジュールの準備ができたので紹介します。かなりの性能向上が期待できます。 パッチ GitHub:https://github.com/php/php-src/pull/1016 ベンチマーク 環境 Fedora 21 x86_64/Intel Core i7/Apache 2.4/PHP 7 custom テストコマンド ab -c 7 -n 500000 http://localhost:8888/session.php テストスクリプト <?php ini_set('session.save_path', '/home/tmp'); ini_set('session.lazy_write', 1); // Change mode here ini_set('session.use_strict_mod

    PHP7の新しいセッションモジュールの性能
  • PHP7の現状

    (Last Updated On: 2018年8月13日)PHP7が今年の秋リリースされる予定です。まだまだ多くの変更が行われる予定ですが、現状を簡単にまとめてみたいと思います。代表的な物のみ取り上げています。 ご存知ない方の為に書いておきます。現在リリースされているPHPPHP5です。次のPHPPHP7になり、PHP6はリリースされません。PHP6をUnicodeをネイティブ文字列としてサポートするバージョンとして開発されましたが、文字エンコーディングチェックを内部で自動的に行おうとするなど、無駄が多く遅いため破棄されました。(文字エンコーディングのバリデーションは来アプリでするものです)このため、PHP6はスキップされ次のPHPPHP7になります。 追記:PHP7.0は既にリリースされています。概要はPHP 7.0の概要・新機能・互換性、詳しくはマイグレーションドキュメントをご

    PHP7の現状
  • 安全なAPI過信症候群 – 普通のRDBMS編

    (Last Updated On: 2018年8月13日)昨日書いた安全なAPI過信症候群の処方箋 – execv/SQLite3編はSQLiteの仕様がRDBMSとしてエキゾチック過ぎて、さらっと書いたよくあるRDBMSでの「安全なAPI過信症候群」を全く理解して頂けなかったケースもあるようなのでもう一度書きます。 プリペアードクエリには色々問題もあり、セキュリティ対策としてそれだけ教えるのはNG、と考えている方はプリペアードクエリ過信症候群ではないので、このエントリを読む必要はありません。 安全なAPI過信症候群(同類にプリペアードクエリ過信症候群など):「安全」とされるAPIを使えば安全と、盲目的に信用し考慮すべきリスクを考えない症候群。ITエンジニアが発症し最も重要なセキュリティ対策である入力バリデーションを「必要ない、できない、セキュリティ対策ではない」エスケープは「必要ない、有

    安全なAPI過信症候群 – 普通のRDBMS編
  • Phalcon 1.3 と 2.0のベンチマーク

    (Last Updated On: 2018年8月13日)Phalcon Adventカレンダー15日目のエントリです。Phalcon 1.3と2.0でどの程度性能差があるか簡単なベンチマークを取ってみました。 ベンチマーク環境 ローカルホストからabコマンドを実行し取得しました。システムは以下の通りです。 OS : Fedora20 x86_64 PHP/httpd : Fedora20 package CPU : Intel(R) Core(TM) i7-4770S CPU @ 3.10GHz MEM : 16GB HDD : INTEL SSDSC2BW240A4 利用したフレームワーク Laravel (比較用にcomposerでインストール) Phalcon 2.0 RPM Phalcon 1.3 RPM PhalconのWebアプリはmicroとsimpleを利用しました。Ph

    Phalcon 1.3 と 2.0のベンチマーク
  • 安全なAPI過信症候群の処方箋 – execv/SQLite3編

    (Last Updated On: 2018年8月13日)またプリペアードクエリなど、安全とされるAPI万能と考えている方に会ったのでエントリを書きました。広く病気として治療すべき、と思いエントリを書きます。安全なAPI過信症候群と名付けました。 安全なAPI過信症候群(同類にプリペアードクエリ過信症候群など):「安全」とされるAPIを使えば安全と、盲目的に信用し考慮すべきリスクを考えない症候群。ITエンジニアが発症し最も重要なセキュリティ対策である入力バリデーションを「必要ない、できない、セキュリティ対策ではない」エスケープは「必要ない、有害である」とする場合、かなり重度の場合が多い。 このブログでは既に何度もプリペアードクエリクエリは不完全である、と指摘しています。プリペアードクエリを使っていれば安全と盲目的に信じている方向けの基礎知識を紹介します。コマンド実行APIのexecvと最も

    安全なAPI過信症候群の処方箋 – execv/SQLite3編
  • Phalcon PHPのRPMパッケージを作る

    (Last Updated On: 2018年8月13日)PHP最速フレームワークのPhalconですが、RPMパッケージを使ったシステムへのインストールは最速ではありません。Ubuntuの場合、パッケージがあってapt-getで一発インストールできるのですが、デフォルト/EPELリポジトリにはRHEL/CentOS/Fedora用のRPMパッケージはありません。そこでPhalconのRPMパッケージを自分で作る手順を紹介します。 このエントリはPhalcon PHP Advent Calendar 2014 2日目のエントリです。 追記:SRPMファイルのダウンロードリンクを忘れていました。次のURLでダウンロードできます。 http://blog.ohgaki.net/files/php-phalcon-1.3.4-1.fc20.src.rpm 私が普段使っている環境はビルドツールが全

    Phalcon PHPのRPMパッケージを作る
  • WordPress MailPoet (wysija-newsletters) Unauthenticated file Uploadの原因と対策

    WordPress MailPoet (wysija-newsletters) Unauthenticated file Uploadの原因と対策 (Last Updated On: 2018年8月13日)今時、ファイルアップロードに脆弱であることは珍しいので WordPress MailPoet (wysija-newsletters) Unauthenticated file Upload として知られている脆弱性を調べてみました。 事前に読んだ情報ではzipファイルがアップロードでき、このためにページの改ざんやコード実行ができる旨の解説がされていました。zipファイルでページ改ざん、で何となくは原因と対策は分かります。 VCSのログを見れば簡単に原因が分かるだろう、と思ったのですがどうも公開されているSVNのコミットはまとめてコミットしているらしく、結構差分がありました。 そこでMe

    WordPress MailPoet (wysija-newsletters) Unauthenticated file Uploadの原因と対策
  • テキストインターフェース処理の基本

    出典:http://ja.wikipedia.org/wiki/User_Datagram_Protocol UDPのデータはヘッダー長フィールドの値によって変わります。ヘッダー部分は固定長のデータです。 バイナリインターフェースの利点は効率が良い事です。例えば、ポート番号がテキストの数値ならテキストからバイナリ値への変換が必要になります。元々バイナリなら変換は必要ありません。(実際にはエンディアンの違いから変換が必要になる場合があります)データサイズも小さくなります。 現在ではテキストインターフェースの多くが可変長のインターフェースを持っています。可変長インターフェースを持つテキストインターフェースは、テキスト情報に意味を持たせるため特定の形式や特別な意味を持つ文字が定義されています。 ここでは「可変長」の「テキストインターフェース」を解説します。 HTTPプロトコル HTTPプロトコル

    テキストインターフェース処理の基本
  • password_hash()の重要な制限

    (Last Updated On: 2019年2月25日)password_hash関数はcrypt関数のラッパーです。パスワードを簡単かつ安全にハッシュ化するための関数です。現在のPHPマニュアルにはpassword_hash関数の重要な制限が未記載であったため追加しました。 password_hash関数はcrypt関数のラッパー password_hash関数は string password_hash ( string $password , integer $algo [, array $options ] ) の書式を持ち、$algoにはDEFAULTまたはPASSWORD_BCRYPTが指定できます。現時点ではPASSWORD_BCRYPTしか指定できないのでどちらを指定しても同じです。DEFAULTを利用することにより、将来より強固なハッシュ関数が追加された場合に自動的な更

    password_hash()の重要な制限
  • PhalconのZephir言語版JavaScript文字列エスケープ

    (Last Updated On: 2018年8月13日)以前にJavaScript文字列のエスケープ関数を紹介しました。試しにPhalconのZephirで書いてみました。 利用した環境 利用した環境は以下の通りです。 OS: Fedora20 x86_64 PHP: Fedora20のPHP5.5パッケージ Phalcon: Fedora19用のPhalconのRPM/SRPMパッケージ のcphalconのソースを2.0.0ブランチに切り替えてビルドした物 Zephir: composerからインストールした物 2.0.0ブランチのcphalconのバージョン番号は1.3.0となっているのでバージョンを確認すると1.3.0 ALPHA 1と表示されます。 [yohgaki@dev utils]$ phalcon Phalcon DevTools (1.3.0 ALPHA 1) Ava

    PhalconのZephir言語版JavaScript文字列エスケープ
  • Heartbleed脆弱性と漏洩する情報のまとめ

    (Last Updated On: 2018年8月8日)Hearbleed脆弱性はSSL接続を処理するサーバーのメモリ内容を盗める脆弱性です。メモリ内には様々な機密情報が含まれています。Webサーバープロセスのメモリ内に保存されている内容は全て盗まれる可能性があります。セッションIDやユーザーのパスワードが盗める場合もあります。Heartbleed脆弱性は任意アドレスのメモリ内容をリモートから自由に読み出す脆弱性なので、サーバーのメモリ内に保存された秘密情報は、SSL秘密鍵に限らず、メモリ内容から盗めます。 影響範囲はシステム構成により異なるので、どのような条件で盗まれるのかまとめました。 大前提は 脆弱性があるOpenSSLライブラリを利用している ことが条件になります。前のブログにも書きましたがシステム構成により影響範囲が変わります。 SSL接続がリバースプロキシで処理されている構成の

    Heartbleed脆弱性と漏洩する情報のまとめ
  • Heartbleed攻撃と対策

    (Last Updated On: 2018年8月4日)OpenSSLにメモリを自由に参照できるhearbleedと呼ばれるバグ(CVE-2014-0160)がありました。概要はTechCruchで解説されています。昨日は対応に追われたエンジニアも多いのではないでしょうか?OpenSSLを利用したシステムの場合、影響がある可能性があります。詳しくは http://heartbleed.com/(英語サイト) で解説されています。 脆弱性の概要 Heartbleed脆弱性とはリモートから接続先のシステム(HTTPSのWebサーバーなど)のメモリ内容を盗みとられるセキュリティ問題です。SSLを利用したシステムはプログラム中(メモリ中)にSSLの秘密鍵を保存しています。メモリ内容を盗み取る事によりSSL秘密鍵を盗み、HTTPSなどの暗号を解読できるようになります。 接続先のシステムがWebアプリ

    Heartbleed攻撃と対策
  • なぜRubyと違い、PHPの正規表現で^$の利用は致命的な問題ではないのか?

    (Last Updated On: 2018年8月13日)Rubyデフォルトの正規表現では^は行の先頭、$は改行を含む行末にマッチします。PHPPCREとmbregexでは^はデータの先頭、$は改行を含む行末にマッチします。 この仕様の違いはデータのバリデーションに大きく影響します。 参考: PHPer向け、Ruby/Railsの落とし穴 の続きの解説になります。こちらのエントリもどうぞ。 なぜ^と$が行の先頭と行の末尾にマッチするのか? そもそも正規表現はテキスト検索を行うステートマシーンとして設計されました。通常テキストには改行があります。特定の行に一致するかどうかテストするように設計するのが自然です。この為、正規表現の^と$は行の先頭と末尾にマッチするように設計されたと考えられます。 正規表現をバリデーションに利用することは可能です。しかし、そもそもは正規表現に一致する「テキスト」

    なぜRubyと違い、PHPの正規表現で^$の利用は致命的な問題ではないのか?
  • 標準と基本概念から学ぶ正しいセキュリティの基礎知識

    (Last Updated On: 2018年11月6日)今回は一部の技術者が勘違いしているセキュリティ概念の話です。技術者とはWebアプリケーションのソフトウェア技術者を指していますが、他の分野の技術者にも同じ勘違いが多いかも知れません。常識であるべき知識が常識でないのが現状のようです。全ての技術者が知っておくべきセキュリティの基礎知識です。 残念ながらセキュリティ対策の定義どころか、プログラムの構造・動作原理も正しく理解されていないと言える状態です。 セキュアコーディングの構造/原理/原則 ゼロトラストとフェイルファースト ソフトウェア開発には膨大な知識が必要です。目的(ソフトウェアを作ること)以外の知識を取り入れる機会や余裕が無かった方も多いと思います。セキュリティ基礎知識を知らなかった方、安心してください!基は簡単です。一度知ってしまえば忘れるような難しい事ではありません。勘違い

    標準と基本概念から学ぶ正しいセキュリティの基礎知識
    Kenji_s
    Kenji_s 2014/02/25
    用語の定義を合わせることはコミュニケーションにおいて重要ですね
  • Webノウハウシェア2013のスライド

    (Last Updated On: 2018年8月13日)5月24日(金)に開催されたWeb担当者向けのセミナーの「Webノウハウシェア2013」にBOSS-CON JAPANのPHP Security AlianceのCTOとして講演してきました。その講演のスライドです。 http://www.slideshare.net/yohgaki/boss-conphp Javascriptを利用した内部ネットワークのスキャンが可能である事は良く知られていると思います。ここ数年セキュリティ研究者は更に企業ネットワーク内の奥深くに侵入する手法を研究しています。 企業内のシステムはインターネットに公開するシステムに比べると甘いセキュリティ対策が採用される事が多いですが、インターネットと同様のセキュリティ対策を行わないと思わぬリスクが発生します。特にSSRFの脅威は広範囲に渡ります。正しく理解しておく

    Webノウハウシェア2013のスライド
  • SSL暗号を無効化する仕組み – BREACH, CRIME, etc

    (Last Updated On: 2018年8月4日)CRIMEやBREACHといったSSL暗号を無効化する攻撃を知っている方は多いと思います。しかし、その仕組みや攻撃方法は広くは理解されていないようです。Webシステムに関わる方であれば、BREACH攻撃の原理と対策を理解しておいて損はありません。BREACHや類似の攻撃は全く難しくありません。直ぐに理解できると思います。原理は簡単です! CRIMEとBREACH攻撃 CRIMEもBREACHも暗号を解読せずに暗号コンテンツを解読する攻撃です。暗号を直接解読するのではなく、圧縮後のサイズ変化を利用したサイドチャネル攻撃を行います。サイドチャネル攻撃とは攻撃対象のセキュリティ対策(CRIME、BREACHの場合は暗号)などを直接攻撃するのではなく、動作を観察して攻撃する手法です。前回のエントリで紹介したタイミング攻撃では、コンピューターの

    SSL暗号を無効化する仕組み – BREACH, CRIME, etc
  • 間違いだらけのHTTPセッション管理とその対策

    (Last Updated On: 2018年10月12日)HTTPセッション管理はWebセキュリティの中核と言える機能です。Webセキュリティの中核であるHTTPセッション管理に設計上のバグがある事は少なくありません。今回のエントリはPHP Webアプリ開発者ではなく、主にWebフレームワーク側の開発者、つまりPHP体の方に間違いがあるという話しです。Webアプリ開発者の回避策も紹介します。 まずセキュリティの基として「入力のバリデーションを行い、正当な入力のみを受け入れる」があります。しかし、PHPに限らず多くのセッション管理機構は当たり前の「入力のバリデーションを行い、正当な入力のみを受け入れる」を行っていません。セッションIDの再生成(リセット)も不完全な物が多いと思います。 参考: 知らないと勘違いする「合成の誤謬」の罠 開発者は必修、SANS TOP 25の怪物的なセキュリ

    間違いだらけのHTTPセッション管理とその対策
  • PHPのOpenSSL関数を利用して暗号化する例

    (Last Updated On: 2021年2月15日) 色々やることがあってブログを更新できていませんでした。久々のブログはPHPのOpenSSL関数を使ってAES-256-CBCを使って暗号化する例です。今時のハードウェアとソフトウェアならハードウェアAESが利用できるので普通はAES-256-CBCで構わないでしょう。 ”パスワード”だけで暗号化する例 暗号を利用する場合のポイントは以下の通りです。 IV(Initialization Vector ソースでは$iv)にはランダムな「バイト」を利用する。IVに16進数のハッシュ「テキスト」を使うと折角のIVの空間を半分にしてしまいます。IVには毎回ランダムバイトを設定する。鍵($key)には「バイト」を利用する。IVと同様にハッシュ「テキスト」などを使うと鍵空間が半分になってしまう。人に256ビットの鍵を要求するのは非現実的なので、

    PHPのOpenSSL関数を利用して暗号化する例
  • PHP本体でタイミング攻撃を防御できるようになります

    (Last Updated On: 2021年3月25日) PHP 5.6からタイミング攻撃に対する対策が導入されます。メジャーなアプリケーションはタイミング攻撃対策が導入されていますが、PHP 5.6から簡単に対策できるようになります。 タイミングセーフな文字列比較関数はhash_equalsとして実装されました。 http://php.net/manual/es/function.hash-equals.php タイミング攻撃とは タイミング攻撃とは、コンピュータが動作する時間の違いを測って攻撃する、サイドチャネル攻撃(副作用攻撃)と呼ばれる攻撃手法の1つです。HTTPSの圧縮の副作用を利用したサイドチャネル攻撃が有名です。 コンピュータの動作時間、温度、音、電子ノイズ、電力使用量など、アルゴリズム自体の脆弱性を攻撃するのではなく副産物を利用する攻撃方法でサイドチャネル攻撃の一種です。

    PHP本体でタイミング攻撃を防御できるようになります