Security and Trust are Priceless

Some articles about security and trust: セキュリティやトラストなどに関して、情報を共有することを目的としています

ユーザーエージェント文字列の偽装可能性について

セキュリティ・ミニキャンプオンライン2021の選考課題3に関して、ユーザーエージェント文字列(以下UA)の偽装可能性などについて考察したのでその一部を残しておこうかなと思いました。

一番下にあるのが、当時提出した解答の大部分です。(満点プラス評価して頂けたので自己肯定感がバクシン)

長いので要約すると、UAの偽装可能性をその正しい形式(from MDN Web Docs)かどうか、そもそも偽装って簡単にできるよねってのを実際に偽装してみて考察しました。また、ポート番号の情報とUAの情報が一致するかなども推定の根拠として使いましたよという話です。

反省としては、そもそもLinuxエフェメラルポート番号の変更可能性についての観点がすっぽり抜けていました(そんなん一般に決まってるもんやし、変えれんやろと思い込んでました)。 あと、curlコマンドのパケットがほんまに一定周期なのかとかも検証したほうが良かったかなと思います。(自分の目で数字比較して大体でしか周期性を見てないので)

httpヘッダのUser-Agentヘッダはcurl/7.74.0 または Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0となっており、Linuxカーネルのマシン上でcurlコマンドを用いたプログラムまたはFirefoxを用いてhttp通信を行ったと考えられる。人がWebにアクセスしたというのはおそらくcurlコマンドを用いたプログラムによりhttp通信を行ったことではなく、ブラウザ(Firefox)を用いてWebサイトにアクセスしたという意味だと考えられるので、Wiresharkにおいて http.user_agent == "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0" というフィルタを用いてパケットを表示し、その際のクライアントのポート番号より、TCPポート番号が求まった。また、http.user_agent != "curl/7.74.0"というフィルタを用いても同様のパケットが表示されており、プログラムが自動的に発生させている通信がcurlコマンドを用いたプログラムの通信、人がWebサイトにアクセスする為にブラウザ(Firefox)を用いた際の通信の2つの通信が行われていたということがわかる。
ただし、これらの解答はユーザーエージェント文字列が偽装されていないという仮定がある。例えば、ブラウザにFirefoxを用いている場合、アドレスバーにabout:configと入力しgeneral.useragent.overrideという設定を追加し、その文字列の値に任意の文字列を入力して、通信を行えば簡単に偽装することができた。また、ブラウザの拡張機能としてユーザーエージェント文字列を偽装するようなものも存在する。このように、ユーザーエージェント文字列は簡単に偽装できるので、ユーザーエージェント文字列のみの情報から人がブラウザを用いてアクセスしているのかどうかを判定する方法では確信が持てない。
また、ユーザーエージェント文字列は標準化されておらず、歴史的な経緯により複雑なものになってしまっている。
ただ、今回の場合はそのような可能性は低いと考えられる。以下はその説明である。
今回のユーザーエージェント文字列はMozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0であり、この形式より、Linux上においてFirefoxを用いて通信が行われたことが推測される。このように考えられる根拠としては、今回の形式はMDN Web Docs(https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent)において示されているFirefoxの場合のユーザーエージェント文字列の形式に従っているからである。
また、一般にLinuxカーネルにおいて割り当てられるダイナミックポート番号(エフェメラルポート)は32768~60999の範囲であり、IANAに準拠していない。また、IANA準拠の場合の範囲は49152~65535であり、今回求めたポート番号は全てこの範囲外にもあるのでIANAに準拠したプラットフォームではないことがわかり、Linuxカーネルであることが推測される。よって、ユーザーエージェント文字列から得られたプラットフォーム情報ではLinuxであり、ポート番号の範囲としてもLinuxと推測され、両者の情報が合致しているので、おそらくユーザーエージェント文字列は偽装されていないと推測される。
また、http通信によって送信されているファイルに関しても、人がブラウザ(Firefox)を用いてアクセスした場合は.html, .css, .js, .icoファイルが送信されており、Webページを表示するのに必要なファイル群が送信されているのに対して、curlコマンドの場合は同じ1つの.htmlファイルが連続して送信されているだけであり、時間的にも1秒間の間に約2回http通信がおそらく一定周期で行われており、人の手によって操作されているとは考えづらい。