今回は「OWASP API Security TOP 10」の「API2:2019 – Broken User Authentication」について解説します。これは認証の不備による脆弱性になりますが、認証が回避できることは非常にクリティカルなため、しっかりセキュリティ対策を行わなければならない箇所になります。
まず、API2:2019 – Broken User Authenticationについて英語では以下のように解説しています。
Authentication mechanisms are often implemented incorrectly, allowing attackers to compromise authentication tokens or to exploit implementation flaws to assume other user’s identities temporarily or permanently. Compromising system’s ability to identify the client/user, compromises API security overall.
認証のメカニズムが適切に機能していなく、トークンやIDが乗っ取られてしまい、API全体のセキュリティがなくなるということを意味します。
アクセス認証にID/パスワードが必要で、ブルートフォース攻撃のように総当たりが可能なサイトであれば、その攻撃が成功する可能性が高くなります。これはAPIに限ったことではありませんが、この攻撃に対して複数回認証失敗した場合にIDを一時的にロックしたり、認証時にキャプチャを使用して総当たりが行われないように対策が必要になります。
また、より強固な認証にするにはワンタイムパスワードを利用したり、デバイスとデバイス間で接続するような場合はクライアント証明書を認証を行うことも検討する必要があります。
ユーザーがID・パスワードを毎回、入力するのは現実的でないため、認証後に一定期間利用できるトークンを発行し、そのトークンが有効な間、APIへトークンを渡すことでAPIの機能にアクセスできるようになります。
認証後に発行されたトークンはAuthenticationヘッダーやCookieなどにセットして送信し、アプリケーションによって様々な方法でトークン管理が行われます。
トークンでアクセスするものだけでなく、アプリケーション間でアクセスを行う場合など、クライアントID、アクセスキーやシークレットのように固定の値を利用してAPIにアクセスすることもあります。その場合は推測が難しいキーの発行や定期的にキーを再発行することがセキュリティを維持するには重要になります。 トークンにはユーザー情報や状態などを含む場合があります。またアプリケーション側でもこの値を利用してユーザーを識別することがあります。1つ例をあげて解説します。 有名なトークンのタイプとしてはJWT(Json Web Token)がありますが、その構造は以下のようになっております。
ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogICJhZG1pbiI6IHRydWUsCiAgIm5hbWUiOiAiQWkgTmVvIiwKICAidXNlcl9pZCI6ICIyMDAwMDEiLAogICJpc19hZG1pbiI6IHRydWUKfQ==.FJVs15OrM2E2cBab31AMHrHDDEfxioYDgeFDDFh9H1Q
これはBase64でエンコードされた文字列で、以下のようにピリオドが区切りとなり、ヘッダー、ペイロード、署名から構成されます。
<ヘッダー>.<ペイロード>.<署名>
ヘッダーとペイロードをデコードしてみると以下のようなJSONで参照できます。
ヘッダー部
ペイロード部
このJWTはヘッダー部とペイロード部が改竄されていないか署名を用いて検証しますが、脆弱性のあるAPIではこの検証がなされない場合があります。
そのため、攻撃者がこの脆弱性を検出したらペイロードを改竄したトークンとして送信し、認証回避を試すでしょう。
上の画面ではペイロード部のuser_idを「200001」から「200003」にセットします。改竄したトークンをBase64にエンコードして以下のようにヘッダーにセットして送信することで、「200003」の別のユーザーになりすますことができます。(ヘッダーでトークンを受け渡ししているような場合)
Authorization: Bearer ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogICJhZG1pbiI6IHRydWUsCiAgIm5hbWUiOiAiQWkgTmVvIiwKICAidXNlcl9pZCI6ICIyMDAwMDMiLAogICJpc19hZG1pbiI6IHRydWUKfQ==.FJVs15OrM2E2cBab31AMHrHDDEfxioYDgeFDDFh9H1Q
今回はJWTで解説しましたが、ユーザーのトークンが改竄できたり、アクセスキー推測可能な弱いキーであったり、またはユーザー認証で利用するID・パスワードが総当たり可能で弱いパスワードポリシーを利用していないか認証部分のセキュリティについて十分検討することが重要です。
Comments