Libsafeを利用したBuffer Overflow防止

気持ちかもしれませんが....

Buffer Overflowとは?

 全てのプログラムはハードディスク上から直接実行するわけでなく、ハードディスクからメモリにロードされて実行されます。そのため、メモリ上にはOSそのものを含めて複数のプログラムのコードが同時に存在することになります。

 このため、何らかの方法でそれぞれのプログラムが干渉しないようにメモリ空間の管理を行う必要があるのですが、この管理は基本的にOSが行っています。OS上で動作するプログラムは、OSに対して"これだけメモリを使わせてください"と自分で申請をして必要な領域を確保してもらってから利用し、使い終わったら"使い終わりました"とOSに申請することにより、他のプログラムが再度その領域を利用できるように開放してもらいます。

 いかなるプログラムであっても、自分が割り当てられた領域の中で動作するように作られています。これはプログラミングを行う際に開発者がそのように設計を行うわけですが、開発時に想定されていなかった特別な操作を行った際に、自分の領域からはみ出てしまうような動作を行うプログラムが出来てしまうことがあります。この自分の領域からはみ出す現象をBuffer Overflowと呼びます。

 Buffer Overflowがセキュリティ的に問題となるのは、この現象を悪用して本来その領域ではないメモリ領域の情報を書き換えてしまうことができてしまうからです。例えば、書き換えてしまうことが出来てしまう領域がユーザーの権利の管理に関係している領域であれば、その部分を上手に書き換えれば管理者権限をも手に入れてしまうことが出来るわけです。

厳密には、スタック上に確保されたローカル変数領域のフレームポインターが
Buffer Overflowを起こした際に、結果として戻り番地を書き換え、その改竄された
戻り番地に任意のコードを置くことにより権限奪取などが可能となることですが、
ここでは説明の簡略化のため概念の説明に留めています。

 

Libsafeとは?

 Libsafeは、米国のBell研究所の研究者が開発したライブラリです。一般にBuffer Overflowが起こりやすいとされている機能を実装しているライブラリを、よりBuffer Overflowが起こりにくいように実装しなおし、更にBuffer Overflowが起こった場合に警告を出したり、Syslogに記録する機能などを持っています。

 LibsafeのWebページ
http://www.avayalabs.com/project/libsafe/index.html

 

Libsafeの入手とインストールと設定

 Libsafeは正式にはサポートされていないものの、Untestedという形でTurbo Linux JapanのFTPサーバーにRPMファイルが登録されています。

 場所は以下のとおりです(2000年11月20日現在)。

ftp://ftp.turbolinux.co.jp/pub/TurboLinux/stable/untested/current/i386/libsafe-1.3-5.i386.rpm
(2001年10月9日現在存在していません)

 ファイルをダウンロードした後、suしてダウンロードしたディレクトリで、

rpm -Uvh libsafe-1.3-5.i386.rpm

 とすればインストールされます。インストール後、/libにlibsafe.so.1.3が登録され、libsafe.so.1にシンボリックリンクが張られます。

 最後に、libsafeライブラリが実際に使用されるように設定します。Libsafeはその性質上、libcやglibcといったライブラリよりも先にリンクさせる必要があります。詳細な説明は省きますが、/etc/rc.d/init.d/functionsに、"export LD_PRELOAD=/lib/libsafe.so.1"という行を加えます。実際のfunctionsの内容としては、

#! /bin/sh
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
# Version: @(#) /etc/init.d/functions 1.01 26-Oct-1993
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Hacked by: Greg Galloway and Marc Ewing
#

# First set up a default search path.
export PATH="/sbin:/usr/sbin:/bin:/usr/bin"

#To Avoid Buffer Overflow
export LD_PRELOAD=/lib/libsafe.so.1

# A function to start a program.
daemon() {

こんな感じになるはずです。

 簡単に言えば、この設定を行えば、/etc/rc.d/init.d以下にある各種デーモンを起動する際に、自動的にLibsafeが適用されることになります。逆にいえば、この設定を加えた後にデーモンを再起動しないと意味がありませんので、できればマシンをリブートして下さい。

 2001年10月9日現在、libsafeのRPMは存在せず、SRPMのみ存在するようです。バージョンも2.0-1になっています。

ftp://ftp.turbolinux.co.jp/pub/TurboLinux/stable/untested/6/SRPMS/libsafe-2.0-1.src.rpm

 動作検証などは行っておりませんが、一般的なSRPMの導入手順を踏めば、後は上記と同じだと思います。