プログラミング言語のセキュリティについて調べてみる

2021/10/09に公開

はじめに

セキュリティ・キャンプ2021のグループワークの活動で、リレー形式のブログを書いていくことになりました。前回のブログはこちら。

前回の方が次の人のテーマを決めることになっていて、僕のテーマはプログラミング言語の安全性や脆弱性です。

プログラミング言語の脆弱性って聞くとCとかC++は脆弱性を生みやすいだとかRustは安全だー とかそういう話を耳にしたことはあるなーと思いながら調べてみました。詳しいわけではないので、変なところがあったら教えてください。

脆弱性と言語

2019年と古めの統計ではあるがIs One Programming Language More Secure Than The Rest?によると、脆弱性情報の多いランキングとして以下のようになっているそうです。

  1. C言語 (47%)
  2. PHP (17%)
  3. Java (12%)
  4. JavaScript (11%)
  5. Python (6%)
  6. C++ (6%)
  7. Ruby (5%)

ただこの統計はランキングが高いからといって、そのプログラミング言語がセキュリティに対して脆弱ということを意味するわけではありません。例えばC言語では長い間使用されてきていることが関係しているそうです。

どんな脆弱性があるのか

具体的にどんな脆弱性があるのか簡単に調べてみました。調べれば山ほど出てきそうですが...

バッファオーバーフロー脆弱性

"バッファオーバーフロー脆弱性は、CやC++などで作成されたプログラムにおいて、メモリ上のバッファ(プログラム実行中に一時的に利用するメモリ領域)の境界を越えて高位にある他のデータの書き換えを許してしまう"
脆弱性のことをいうそうです。これによって、実行しているプログラムのクラッシュや、shellを起動されることによって管理者権限を奪われ、コンピュータを自由に操作されてしまう可能性があるそうです。
プログラムは実行されるときに、そのプログラムで独立した "スタック" という領域が用意されます。スタックでは、関数の呼び出しごとに必要なデータをスタックフレームという単位で管理しています。スタックフレームは、高位のアドレスから関数実行後の戻りアドレスとなるリターンアドレスの値、ローカル変数へアクセスする際の基底アドレスとなるebpレジスタの値、関数で使用するデータを一時的に保存する領域であるバッファ、ローカル変数といったデータから構成されます。
バッファオーバーフロー脆弱性のあるプログラムでは、スタックに確保されたバッファに対して、その容量を上回るサイズの(プログラムの外部から)入力を与えると、バッファの高位にあるデータが上書きされてしまうことがあります。
これがバッファオーバーフロー脆弱性というやつだそうです。

フォーマット文字列脆弱性

フォーマット文字列攻撃は、printf() や syslog() 等のライブラリ関数がもつ書式編集機能を悪用し、実行中のプログラムのメモリに悪意のある機械語コードを送り込んで実行させる攻撃のことをいうそうです。
%s や %x といった書式トークンでスタックなどのメモリ位置の内容をデータとして出力させたり、%n トークンを使って任意のアドレス位置に任意のデータを書き込ませたりできてしまいます。
これらを組み合わせることで、不正なコードを指定したアドレスに書き込んだり、実行させたりできてしまうそうです。

Rustと安全性

最初にRustがあーだこーだいったので、Rustの安全性について軽く調べてみました。
一般にRustの安全性はメモリ安全性からくるそうです。メモリ安全性というのは、メモリの管理を厳格に行うことで、C言語などでの脆弱性の課題を解決するそうです。
一つのリソースは一つの所有者(変数やブロック)のみに関連付けされるというのがRustのリソース管理機能で、こういった機能によってメモリ安全性を保証しているようです。
こういった機能がAndroidといった大きなサービスでも使われ、その安全性を支えているそうです。

終わりに

脆弱性についてあまり書けませんでしたが、かなり古くからある脆弱性など色々とあるなぁという感じでした。調べてみるといろいろな発見があったのでよかったです。

次回はこちらのブログで更新予定です。

参考文献

セキュア・プログラミング講座 | IPA
脆弱性が多いプログラミング言語、第2位はPHP - 第1位は? | Tech+
Is One Programming Language More Secure Than The Rest? | WhiteSource
バッファオーバーフローへの対策技術入門 | 明治大学
書式文字列攻撃 | Wikipedia
Rust (プログラミング言語) | Wikipedia
メモリー管理を安全に、次代のシステムプログラミング言語「Rust」の魅力とは | XTECH

Discussion