8進数って使っていますか?

知識としては知っているつもりですが、わたしは使っていないと思います。
仕事柄2進数や16進数は使うことがよくあります。
が、8進数を使うことはほとんどないと思います。

npmってご存じですか?
Node.js用のパッケージ管理システムです。
npmでは非常に多くのsoftwareが利用できるようになっています。
そのなかでもよく使われているものの1つに、netmaskという名称のsoftwareがあります。
netmaskはNode.jsで書かれたプログラムの中でネットマスクに関連する機能を提供します。
って、そのままですね。

で、このnetmaskの処理の中に、うまくない部分があったことがわかりました。

数字はいろいろな表し方ができます。
単純に数字が並ぶとそれは10進数であることが多いです。
0xから始まる数字は、まぁ普通は16進数ですよね。
同じ感じで、0から始まる数字は、8進数だったりします。

これ、もともとの仕様が優しくないですよね。
16進数の場合はしっかり0xから始まりますので解釈を間違うのは解釈するひとの怠慢な感じもしますが、8進数の場合先頭に0があるかどうかだけですので、たとえば桁数をそろえる目的で先頭に0を同じ桁になるように埋めているだけなのか、それとも8進数を示すものとして先頭に0が付いているのかが判断しにくい場面があると思われるからです。

こういったことがあったんだとは思うのですが、npmのnetmaskには、このあたりの問題がありました。

URLやIPアドレスの類を処理する際には前述のようなこともありますので、先頭についた0は通常は8進数として処理するようにするべきなのです。
が、npmのnetmaskでは、これを単に先頭の0を削除して処理を継続する、という実装をしてしまっていました。

これを文字通り考えるとたいしたことではないように感じますが、この特性は使いようによっては非常に危険です。
たとえば、接続可能なIPアドレスの範囲を判定する機構の中でnetmaskを使ったような場合に、本来であれば通信できるべきでないところと通信ができてしまうことを意味します。
で、その通信できるべきでないところにファイルを送信されてしまったらどうでしょう。
もしくは、通信できるべきでないところからスクリプトをインポートされて実行されてしまったらどうでしょう。
アクセスコントロールにおいて、IPアドレスの範囲の判定は結構重要な位置を占めていると思います。

怖いですね。
不十分な知識で何かを作るのは、時にはとても怖いことになるという例かもしれません。

わたしは物を作ることが仕事になっている人の一人です。
作りこもうとしている仕様や前提条件が意図した意味以外となってしまうことはないのか、よく考える必要がありそうです。
気を付けねばならない、と感じました。

参考記事(外部リンク):Critical netmask networking bug impacts thousands of
applications

www.bleepingcomputer.com/news/security/critical-netmask-networking-bug-impacts-thousands-of-applications/