Slide 1

Slide 1 text

PHP8.2の新機能 ✞SensitiveParameter✞につい て kuzushiki

Slide 2

Slide 2 text

自己紹介 kuzushiki 社会人3年目 Webアプリケーション関連のおしごと 最近のニュース 社内CTF開催で忙しい… 作問ネタ募集中

Slide 3

Slide 3 text

発表内容 「PHP」の新しいメジャーバージョン「PHP 8.2」が、12月8日にリリースされた。 新機能の一つである SensitiveParameter がセキュリティの観点で興味深かったので、デモを交えなが ら紹介する。

Slide 4

Slide 4 text

SensitiveParameter ってなに? このアトリビュートを使うと、スタックトレース中に現れた場合に、 値を削除すべき秘密の値としてパラメータをマークできます。 なんでこんなものが必要なの? -> スタックトレースからパスワード等の機密情報が漏洩する可能性があるから HTTPS://WWW.PHP.NET/MANUAL/JA/CLASS.SENSITIVE-PARAMETER.PHP より引用

Slide 5

Slide 5 text

ログイン機能のデモ 下記のコードには 1 点(もしくはそれ以上?)問題があります。 認証を突破してみましょう。 1 '; 9 } else { 10 $message = 'ログイン失敗...
'; 11 } 12 } 13 ?>

Slide 6

Slide 6 text

デモの結果 ?input[]=〇〇 のようにすることで $_GET['input'] に配列を渡せてしまうのが問題 PHP 8.1 : スタックトレースにてパスワードが表示されてしまった。 -> 危険! PHP 8.2 : スタックトレースには Object(SensitiveParameterValue) が表示された。-> 安全 PHP 7.4 : 警告は出るがエラーにならない。 -> 安全? ` ` ` `

Slide 7

Slide 7 text

補足: どうやって Sensitive だと判定しているの? hash_equals() はパスワードやハッシュの検証に使われるため Sensitive な値が入ることを考慮され ている この関数は、タイミング攻撃を緩和するために使われるべきです。 たとえば crypt() によるパスワードのハッシュを検証する場合など です。 一方で通常の文字列比較 strcmp() を使ってしまうとスタックトレースにパスワードが出てきてしまう -> セキュリティ目的では hash_equals() を使うべき ` ` HTTPS://WWW.PHP.NET/MANUAL/JA/FUNCTION.HASH-EQUALS.PHP から引用 ` ` ` `

Slide 8

Slide 8 text

SensitiveParameter 以外に考えられる対策 そもそもエラーを表示しない error_reporting(0); を記載 パスワードを 15 文字より長くする(おすすめしません) 長いと省略される Fatal error: Uncaught TypeError: hash_equals(): Argument #2 ($user_string) must be of type string, array given in /var/www/html/index.php:9 Stack trace: #0 /var/www/html/index.php(9): hash_equals('thisislongpassw…', Array) #1 {main} thrown in /var/www/html/index.php on line 9 ` `

Slide 9

Slide 9 text

おわりに PHP 8.2の新機能、 SensitiveParameter について紹介した スタックトレース内に重要情報が表示されるのを防げるため、可能なら PHP8.2 を使うようにしたい セキュリティ目的での文字列比較は hash_equals() を使うべき ` `