OWASP ASVS読み込んでみる(V2：認証の検証要件)

## これは何？
どうもさばかんです。

ちなみにこれをやり始めた理由は興味半分、趣味半分です。(完全に私利私欲)


以下のリンクの文書を読み込んでいこうと思います。

[OWASP ASVS v4.0.3 PDF（直接ダウンロード注意）](https://raw.githubusercontent.com/OWASP/ASVS/v4.0.3/4.0/OWASP%20Application%20Security%20Verification%20Standard%204.0.3-en.pdf)

個人的な備忘録なため誤った理解などもあると思います。

コメントなどでご指摘いただけると幸いです。

また本記事は以下の構成で作成しています。

> ASVS本文

```
ChatGPTによる日本語翻訳
```


---

# V2(認証：Authentication Verification Requirements)
> **Authentication is the act of establishing or confirming someone (or something) as authentic, that claims to have a given identity.**

> **Authentication is one of the most important parts of web application security, and is unfortunately implemented poorly in many applications.**


```
日本語訳：

認証とは、ある人物（または物）が自分の身元を主張したときに、それが本当に正しいかどうかを確認する行為のことです。

認証はWebアプリケーションセキュリティにおいて最も重要な要素の一つですが、

残念ながら、多くのアプリケーションでは正しく実装されていません。
```

ひとこと：
認証の定義と多くのアプリではいい感じに設計できてなくて悲しんでますね。

---

- V2.1 **センシティブなデータや機能にアクセスする前にユーザーが確実に本人か確認してね**

- V2.2  **ユーザごとにユニークな識別子があるか(ユーザーをちゃんと追跡できるか)**
- V2.3 **ユーザー本人確認は三要素認証のどれかの最低1つを使っているか**
- V2.4 **リプレイ攻撃に対して全ての経路で対策ができているか**
- V2.5 **認証処理はサーバー側で行われているか(クライアントサイドでだけで終わらせていないか)**
- V2.6 **認証結果はユーザーID,タイムスタンプ、発信元を記録しているか** 
- V2.7 **パスワード入力中は入力欄のパスワードが隠されているか**
- V2.8  **全ての認証処理は信頼されるデバイスか信頼される経路(HTTPSやVPN)で行われているか**
- V2.9 **認証に失敗したとき詳細なエラーなどを出して攻撃者にヒントを与えていけないよ(安全な失敗を用意してね)**
- V2.10 **パスワードを入力するときはペースト機能に対応してあげてね**
- V2.11 **パスワードを入力するときはブラウザのオートフィルとオートコンプリートは無効になってるか確認してね**
- V2.12 **認証処理の時はユーザー名かパスワードどちらが間違っているかを表示していないか確認してね**
- V2.13 **一定回数失敗したらアカウントロックしてログに記録しているか確認してね**
- V2.14 **総当たり攻撃を防ぐためにCAPTCHAやログイン後の遅延をしているか**
- V2.15 **ログイン、パスワードリセット、アカウント復旧からユーザーの存在を推測させないでね**
- V2.16 **ログイン時にセッションIDを更新するセッション管理を使っているか**
- V2.17 **通信が完了したあと、一定時間ユーザーの操作がなければ、セッションをタイムアウトするようにしてね

> **V2.1: Verify that user identities are established and verified prior to being authorized to access any sensitive data or functions.**

```
日本語訳
ユーザーがセンシティブなデータや機能にアクセスする前に、

そのユーザーの身元が確立され、検証されていることを確認してください。
```


> **V2.2: Verify that users are assigned unique identifiers for tracking throughout the application.**

```
日本語訳
アプリケーション全体を通じてユーザーを追跡できるように、

ユーザーごとに一意の識別子が割り当てられていることを確認してください。
```


> **V2.3Verify that user identity is authenticated using at least one of the following: something you know, something you have, or something you are.**

```
日本語訳
ユーザーの本人確認は、

「知っているもの」「持っているもの」「本人そのもの（生体情報など）」のうち、

少なくとも1つを使用して認証されていることを確認してください。
```

> **V2.4Verify that all authentication pathways are protected against replay attacks.**

```
日本語訳
すべての認証経路が、リプレイ攻撃に対して保護されていることを確認してください。
```

※ リプレイ攻撃とは：
利用者の送受信を盗聴して(ID,パスワードなど)、盗聴した情報からユーザーになりすます攻撃のこと

> **V2.5Verify that all authentication controls are enforced on the server side.**

```
  
日本語訳

すべての認証に関するコントロールが、サーバーサイドで確実に実施されていることを確認してください。
```

ひとこと：
フロントエンドのバリデーションだけで済ませるなって話ですね。


> **V2.6: Verify that all authentication decisions are logged with user ID, timestamp, origin of request, and success or failure.**

```
日本語訳
すべての認証に関する判断は、ユーザーID、タイムスタンプ、リクエストの発信元、そして成功・失敗の結果とともに記録されていることを確認してください。
```
ひとこと：
まぁ割と当たり前ですよね。

> **V2.7: Verify that all password fields do not echo the user’s password when typed.**

 ```
日本語訳

すべてのパスワード入力欄で、入力中にパスワードの内容が表示されないことを確認してください。
```

> **V2.8: Verify that all authentication controls are enforced on trusted devices or over trusted paths.**

```
日本語訳

すべての認証コントロールが、信頼できるデバイス上、または信頼できる通信経路上で実行されていることを確認してください。
```
ひとこと：
まぁHTTPで認証するとか怖すぎますもんね。


> **V2.9: Verify that all authentication controls fail securely to ensure they do not expose system details or overly verbose error messages.**


```
日本語訳

すべての認証処理において、安全な方法で失敗するように設計されており、

システムの詳細や過剰に具体的なエラーメッセージが表示されないことを確認してください。
```
ひとこと：
エラーメッセージも相手に対してヒントになることは明確ですもんね。
「ユーザー名が間違っています」
「パスワードが間違っています」
これだけで２択に絞れますもんね。


> **V2.10: Verify that password entry fields support paste functionality.**

```
日本語訳

パスワード入力欄が、貼り付け（ペースト）機能に対応していることを確認してください。
```
ひとこと：
パスワードマネージャーがペースト機能使うっぽいのでそれが理由の一つでペースト使えるようにしてねってことらしいですね。

> **V2.11: Verify that password entry fields do not permit autofill or autocomplete by the browser.**

```
日本語訳

パスワード入力欄では、ブラウザによるオートフィルやオートコンプリートが無効化されていることを確認してください。
```

ひとこと：
他人が端末使った時に簡単に勝手に入力できてしまうのは困りますもんね。


> **V2.12 Verify that all authentication responses do not reveal whether it was the username or the password that was incorrect.**

```
日本語訳
すべての認証応答において、ユーザー名とパスワードのどちらが間違っているのかを表示しないことを確認してください。
```
ひとこと：
V2.9でも書いたことの一番やりかねない具体例きましたね。

> **V2.13: Verify that account lockout for failed login attempts is enforced after a set number of failed attempts, and that it is logged.**

```
日本語訳

ログイン失敗が設定された回数に達した場合、アカウントがロックされること、

およびその処理がログに記録されていることを確認してください。
```


> **V2.14 Verify that the application has protections against brute-force attacks, such as progressively increasing delays or CAPTCHA after failed logins.** 

```
日本語訳

アプリケーションには、ブルートフォース攻撃を防ぐための対策（たとえば、ログイン失敗後に遅延を増加させる、またはCAPTCHAを表示するなど）が実装されていることを確認してください。
```
ひとこと：
短時間にすごい量のログインするための情報送れちゃったらそれだけでも危ないですもんね...


> **V2.15 Verify that username enumeration is not possible via login, forgot password, or account recovery responses.**

```
日本語訳

ログイン、パスワードリセット、アカウント復旧などの応答を通じて、

ユーザー名の存在可否が外部から推測できないことを確認してください。
```



> **V2.16Verify that a secure, built-in session manager is used that generates a new session ID on login.**

```
ログイン時に新しいセッションIDを生成する、

安全な組み込み型セッション管理機構が使用されていることを確認してください。
```
ひとこと：
新しくログイン画面開いた時、セッションID変わってなかったらそのリンク持つだけで誰でもログインできかねないリスクがあるので怖いですよね
ちなみに
このことを**セッション固定攻撃**って言うらしいです。

> **V2.17Verify that authentication session timeouts are enforced on the server after the predetermined period of inactivity.**

```
日本語訳

あらかじめ設定された非アクティブ時間が経過した後、

サーバー側で認証セッションがタイムアウトされることを確認してください。
```
ひとこと：
ずっとセッションが残り続けるとか怖すぎます。


## 最後に

ここまでのご閲覧ありがとうございました。

まだまだ続いていきますので、気長にお待ちください。

#### 関連リンク

https://qiita.com/nanashi39/items/949602d87b4b61477835

https://qiita.com/nanashi39/items/7ab2c3ff443ff3d01565

https://qiita.com/nanashi39/items/8b055d9b7f321469f598