2023年6月25日日曜日

アクセスコントロールの責任分界点

 先日転職ドラフトの情報漏洩事故がありましたね。この事故に対する重大さの感覚がエンジニアと非エンジニアで(さらにいうならエンジニア間でもレベルによって)まるで違うように思えたので、ちょっと取り上げます。

3行で

  • 事象: 本来第三者が閲覧できないはずの情報(オファー情報)が閲覧できていた。
  • 原因: バックエンド側でアクセス制御せずに全ての情報を返し、フロントエンドで表示すべきか否かの判定を行っていた。
  • 補足: HTML上でもその情報が設定されていたけれど非表示になっていただけだった。そのためHTMLソースを見ると簡単に覗けてしまう状態だった

事故というより、もはや事件

元記事にはこのような内容もありました。

2022年6月13日に実施した機能開発における、システム設計の考慮漏れによるものです。機能開発時に、当該画面においてユーザーに表示する可能性のある全ての情報をサーバーサイドからフロントエンドへ渡し、フロントエンド側で動的に判断して表示の可否を決める処理を行っておりました。

考慮漏れは誰にでもあるよね!次から気をつけようね!

・・・というレベルではなく、完全に第一歩目から間違った方向に踏み出したレベルのミスです。考慮漏れなんて簡単な言葉で済ませないでくれ。

どれくらいヤバいの?

冒頭に書いた「重大さの感覚」ですが、まともなエンジニアならこの設計を知った時点で在らん限りのマサカリを投げ、自分の力の及ぶ限り修正しようと努めます。

力及ばず(決定権を持つ人が技術に無理解だったなど)押し通されたら、その日のうちに転職先を探すレベルです。もちろん転職ドラフト以外を使って

「いや、多少設計上の問題はあるかもしれないけど、さすがに大袈裟だろ」思った人は、セキュリティーの専門家に聞いてみてください。そこが感覚の違いです。

ミスは誰にでもある

いや、ミスは誰にでもあります。自分も山ほどミスをしています。それに誰だって最初はプログラミング初心者です。そこは別に責められることではありません。

ただし、今回は「この設計がヤバいとわかる人が現場レベルでいなかったのか?」とか「わかる人が声をあげても、技術のわからないプロマネに却下されたのか?」とか、組織としての技術レベルや開発体制が透けて見えて、ヤバさがわかる人は「このサービス使わんとこ」と思えるレベルの設計ミスです。

よりによってITエンジニア限定の転職サイトで、市場価値の高いITエンジニア(事の重大さがわかるITエンジニア)ほどサービスから離れてしまうとは何という皮肉か・・・

バグ修正は後で、とにかくリリースを優先に

とにかく早くリリースしたい。バグは後で直せばいい。

これはよく聞くし完全に反対するわけでもないのですが、そうは言っても可能な限り取り除かなければいけないバグというものもあります。


「ちょっと表示が崩れてる」とかなら後で直せばいいというのはわかる。

「微妙にUIがわかりにくい」というのもまあわかる。

「負荷分散が不十分でたくさんアクセスが来たら落ちちゃった」もとかもまあある。

「キャッシュの設定ミスで他のユーザーの情報が出ちゃった」とかはお粗末だし重大な事故ではあるけど、「そもそも問答無用で全URLをキャッシュさせていた」とかじゃなくて「キャッシュを利かせないURLのパターンを間違えた」ならまあ起きてしまった背景は理解できる。


上の例は全て「本来あるべき設計」を自分が理解していて、その設計に実態がついていっていない(バグ)ために起きる問題です。しかし今回は「そもそも最初から全ての情報を閲覧できるように意図的に設計していた、それが問題だと思った人がいなかった(あるいはいたけど声をあげなかった、声をあげたが強行されてしまった)」ために起きた問題です。

今回のような初歩の設計上のミスで「リリース優先」はあり得ない…と思ったんですが、そもそもこれがバグだと思っていなければリリースしちゃうよね。

…で、本題。

ちょっと長い前置きでしたが、ここからが本題です。本題ってなんだっけ。そうそうアクセスコントロールの責任分界点でした。

答えはとてもシンプルです。

「バックエンド側で全てやる」

これが鉄則。一切の例外はありません。

応答性や操作性の向上のために、APIを呼ぶ前にフロントエンド側で呼ぶかどうか判断するのは悪いことではありません。しかしその場合でも「呼ばれるべきでない状況で呼ばれたらエラーを返す」「呼び出し元の権限上表示すべきでない情報は返さない」など、最終的にはバックエンド側で制御しなければいけません。

転職ドラフトといえば…

転職ドラフトは以前に使ったことがあるんですが、ある事情で一度退会して再度登録しようとしたことがあります。

そもそもそういう使い方をしてもいいのかを含めてサポートに問い合わせたんですが、サポートからは「退会しても情報は消えず、他の人から見えたままになるので情報を消したければ退会前に自分で消してね(無害な情報に書き換えてね)」と言われました。

えっ。

つまり、退会したらセンシティブな情報(本名とか)を含めてずっとサービス上に残り(誰でも閲覧可能な状態にしていたらずっとそのままで)、それを消す手段がなくなるということ。なんやねんその仕様。

意味がわからなかったけど、そもそも設計上の問題だったのかと納得したところです。

0 件のコメント:

コメントを投稿