Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

kuzushiki
December 20, 2022

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

26回 初心者のためのセキュリティ勉強会(オンライン開催)の発表資料です。
https://sfb.connpass.com/event/268767/

kuzushiki

December 20, 2022
Tweet

More Decks by kuzushiki

Other Decks in Technology

Transcript

  1. ログイン機能のデモ 下記のコードには 1 点(もしくはそれ以上?)問題があります。 認証を突破してみましょう。 1 <?php 2 // PHP8.1

    3 ... 4 if (!isset($_GET['input'])){ 5 $message = 'パスワードを入力してください'; 6 } else { 7 if (hash_equals($password, $_GET['input'])){ 8 $message = 'ログイン成功!<br>'; 9 } else { 10 $message = 'ログイン失敗...<br>'; 11 } 12 } 13 ?>
  2. デモの結果 ?input[]=〇〇 のようにすることで $_GET['input'] に配列を渡せてしまうのが問題 PHP 8.1 : スタックトレースにてパスワードが表示されてしまった。 ->

    危険! PHP 8.2 : スタックトレースには Object(SensitiveParameterValue) が表示された。-> 安全 PHP 7.4 : 警告は出るがエラーにならない。 -> 安全? ` ` ` `
  3. 補足: どうやって Sensitive だと判定しているの? hash_equals() はパスワードやハッシュの検証に使われるため Sensitive な値が入ることを考慮され ている この関数は、タイミング攻撃を緩和するために使われるべきです。

    たとえば crypt() によるパスワードのハッシュを検証する場合など です。 一方で通常の文字列比較 strcmp() を使ってしまうとスタックトレースにパスワードが出てきてしまう -> セキュリティ目的では hash_equals() を使うべき ` ` HTTPS://WWW.PHP.NET/MANUAL/JA/FUNCTION.HASH-EQUALS.PHP から引用 ` ` ` `
  4. 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 ` `