セキュリティの件で質問なんですがCakePHP3.9で作ったwebサービスで脆弱性診断を受けてログインユーザーAのセッションIDを使ってログインユーザーBがログインユーザーAの権限で操作できてしまうという報告がありました。  
他人のセッションIDを使えばその人になりすまして操作できるのは当たり前だと思うのですが、他人のセッションIDを使われても正しい権限の検証ができるようにするにはどうすればいいのでしょうか？  
ログイン管理やアクセス管理はCakePHPのコンポーネントに任せています。
CC BY-SA 4.0
2023-07-07T07:37:35.497
95513
2023-07-09T16:30:58.053
2023-07-07T10:27:09.157
3054
59017
question
cakephp security session sessionid
他人のセッションIDを使用されたときの対策
おそらく「（セッション ID
を盗める脆弱性があって）ログインユーザーBがログインユーザーAの権限で操作できてしまうという報告」のような報告だったのではないかと想定した回答です。

他人のセッションIDが使われると大変なので、セッションIDが盗まれにくくしたり、仮に盗まれても影響範囲が小さくなるようにする必要があります。たとえばIPAが出している[「安全なウェブサイトの作り方」](https://www.ipa.go.jp/security/vuln/websecurity/session-
management.html)には大まかに以下のことが書かれています（2023年時点）。

  * セッションIDを推測が困難なものにする。
  * セッションIDをURLパラメータに格納しない。
  * HTTPS通信で利用するCookieにはsecure属性を加える。
  * ログイン成功後に、新しくセッションを開始する。
  * ログイン成功後に、既存のセッションIDとは別に秘密情報を発行し、ページの遷移ごとにその値を確認する。
  * セッションIDを固定値にしない。
  * セッションIDをCookieにセットする場合、有効期限の設定に注意する。

詳しくはIPAのサイトをご覧ください。

質問者さんが具体的にどのような対応を取るべきなのかは、指摘された脆弱性の種類によります。どのようにセッションIDが盗まれてしまうのかという部分を理解して、修正することになるでしょう。CakePHPであれば
<https://book.cakephp.org/3/ja/development/sessions.html>
のあたりに一般的な話題についてのドキュメントがあるので、IPAの資料と共に参照してみてください。
CC BY-SA 4.0
2023-07-07T08:12:33.907
95515
2023-07-09T16:30:58.053
2023-07-09T16:30:58.053
5793
19110
95513
answer
興味本位での質問でなければ、まず指摘された脆弱性とリスクを正確に把握することが必要です。  
CVSS等で脆弱性のリスクが示されているはずですが、そのリスクと保護する情報資産の価値、その他対策に掛かる工数等を総合的に判断して、対策しないことも含めて対策内容が変わってきます。

* * *

以下、興味本位での回答です。  
質問内容は、攻撃手法「[CAPEC-593: Session
Hijacking](https://capec.mitre.org/data/definitions/593.html)」の子要素「[CAPEC-60:
Reusing Session IDs (aka Session
Replay)](https://capec.mitre.org/data/definitions/60.html)」への対策になろうかと思いますが、既に@nekketsuuuさんの回答で網羅的に示されている対策とほぼ同じです。

  1. ユーザーがログアウトした後は、必ずセッションIDを無効にする。
  2. セッションIDのセッションタイムアウトを設定する。
  3. クライアントとサーバー間の通信を保護する。例えば、SSLを使用して攻撃者による中間攻撃(CAPEC-94)を軽減することが最善の方法。
  4. GETメソッドを使用してセッションIDを送信するコードを作成しない。
  5. セッションIDに関連付けられたセッションデータを暗号化する。
  6. 多要素認証を使用する。

その他で個人的に思い付くのは、TLSでクライアント認証をすることです。  
クライアント認証が通らなければセッションIDを再利用できないので、仮に漏れたとしても悪用できないと考えます。  
クライアント認証をしているWebサイトは少なく、秘密鍵や公開鍵証明書の適切な管理をユーザーに求めるのは敷居が高いと思いますが、[銀行の法人口座](https://corporate.bk.mufg.jp/biz/servicein/ea.html)等では使われているようです。

日本ではマイナンバーカードが普及したので、[利用者証明用電子証明書でログイン](https://www.soumu.go.jp/kojinbango_card/kojinninshou-01.html)できるサイトは増えていくのかもしれませんが、クライアント認証にも使えれば秘密鍵の管理が楽そうなんですけどね。
CC BY-SA 4.0
2023-07-08T07:06:00.523
95523
2023-07-08T07:06:00.523
7291
95513
answer