Google Chromeの脆弱性、7割がメモリ関連の問題

Google Chromeの脆弱性、7割がメモリ関連の問題

私もいつも使っているGoogleのブラウザ「Chrome」だが危険度の高い脆弱性が2015年以降、約900件見つかっているらしい。
そして、その7割がメモリに関する脆弱性という。

確かに新しいタブを開く度にメモリ操作をしているように思います。

Google:提供

Chromeに使われている開発言語は、「C」もしくは「C++」らしいですが、
C言語は、慣れない人にとってみれば、ポインタの使い方が難しいと言われています。
しかし、ながらポインタを理解できない人がC言語を使ってしまうと脆弱性どころかバグだらけになってしまうかもしれません、C言語はいろいろなことができて良いのですが、間違って使うと大変なことが起こります。

高まるセキュア開発の必要性

開発者は、やはり優れた機能を優先してしまう、それがプログラム開発の楽しみでもあると思います。
私も大学を卒業してこの世界に入ったころは、まずは新しい機能を優先していた。
ありがちですが、つい正常系を優先して、動いたことに満足していたと思います。
しかし、ビジネス的に考えると、異常系、エラー処理をどれだけ完璧なものに作り上げるかが重要となってきます。
ビジネスマンもベテランになるころには、開発時には常に様々な異常系の処理を考えるのが当たり前のようになっていくと思います。
しかし、「サイバーセキュリティ」という言葉を意識して開発したことは、本当にここ数年ではないかと思います。
「サイバーセキュリティ」=「脆弱性」、この意識が実はものすごく重要になってきています。

脆弱性を意識しだすと、開発過程で考えることが変わってきます。
例えば、IDやパスワードをメモリ上の変数に平文で入れてしまったり、データベースのテーブルへも平文でInsertしたり、Updateしたりしたころもあります。
今考えるとなんて恐ろしいことをしていたんだろうと思います。
これが「セキュア開発」というもののほんの一部ですが、開発時の考え方が全く違う気がします。
プログラムを動かす際には、メモリ上でいろんなことを展開していきますが、その使用したデータに対して、あと処理はしているのでしょうか。そのままにしておくことが脆弱性につながります。

C言語のライブラリもセキュアとは言えない

例えば、メモリをアロケートして、その上でデータを使用して、処理が終わると解放しますが、その後処理はしているのでしょうか?
これって、使い古したパソコンをハードディスクの中身にデータが入ったまま捨ててるのと同じだと思います。
C言語の関数で言えば「malloc」関数を使ってメモリを確保し、使い終わったら「free」関数でメモリを解放する。
解放? これでは全く解放されていない、ポインタが解放されるだけで、データはメモリ上に残っています。
解放する前には使用したメモリをゼロクリアすべきでしょう。
簡単に言うと、これが「セキュア開発」の基本的なところでもあります。

そもそもC言語の標準関数(stdlib.h)には、「malloc」はメモリを確保するだけ、「calloc」はメモリを確保しその確保したメモリをゼロクリアしておく関数です。
この二つの関数でメモリの使用後はどうするのでしょうか?
どちらも「free」関数でメモリを解放するだけではないでしょうか。
私も昔は、free関数でメモリを解放するだけでした。これをセキュア開発の上では脆弱性を残すことになります。解放する前に必ず使用したメモリは意図的にゼロクリアすべきです。

でも、そもそも「calloc」はメモリを確保してゼロクリアするのに、逆に「cfree」という関数があってゼロクリアしてからメモリを解放するという関数があってもいいのではないでしょうか。
もちろんセキュア開発を意識している人は、自分で意図的に作っている方も多いと思います。

このようにちょっとした考え方の違いですが、セキュア開発というものはサイバーセキュリティを考える上で非常に重要だと思います。

Chromeの脆弱性の7割がメモリ関連というのもよくわかります。
しかし、世の中のプログラムのほとんどがこのようなメモリ関連の脆弱性が多いと思います。

学生の時から、部活動でグランドを使ったら、必ずならすし、体育館を使えば必ず床にモップをかける、
当たり前のようにやっていました、開発エンジニアになってメモリを使うときは、自分が使う前はきれいに(ゼロクリア)するのに使った後はそのままです、いつの間にかマナーが悪くなったのではなかろうか、と思う気もします。使ったメモリはきれいに掃除する、これがセキュア開発の基本でしょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です