スポンサーリンク

chrootは、ルートディレクトリを変更するためのシステムコールです。
主に、プロセスを特定のディレクトリに閉じこめるために利用します。
プロセスを狭い空間に閉じこめることにより、余計なファイルへのアクセスを不可能にすることができます。そうすることでセキュリティ的に安全な場合もあるかも。

FreeBSDで少しchroot(2)で遊んでみた。
chroot(2)が抜けられそうだが、抜けられない。

下記のコードを実施した。

chroot /tmp/chroot
chdir /
この時点で getcwd は /
mkdir foo
chdir /foo
この時点で getcwd は /tmp/chroot を返す


テストした環境は、下記の2種類の環境です。

  • 6.1-RELEASE
  • 6.2-RELEASE-p5
ソース chroot_hack.c
#include <stdio.h>
#include <stdlib.h>

#include <err.h>
#include <unistd.h>
#include <sys/param.h>

#include <sys/types.h>
#include <sys/stat.h>

char *
Getcwd (char *buf, size_t size) {
	char *p = getcwd (buf, size);
	if (! p) {
		perror ("getcwd");
	}
	return (p);
}

void
printcwd (void)
{
	char	path[MAXPATHLEN];
	if (Getcwd (path, sizeof (path) ) == NULL) {
		exit (EXIT_FAILURE);
	}
	(void) puts (path);
}

void
Chdir (const char *path)
{
	if (0 != chdir (path) )
	{
		err (EXIT_FAILURE, "chdir(%s)", path);
	}
}

void
Chroot (const char *dirname)
{
	if (0 != chroot (dirname) ) {
		err (EXIT_FAILURE, "chroot(%s)", dirname);
	}
}

void
Mkdir (const char *path, mode_t mode)
{
	if (0 != mkdir (path, mode) )
	{
		err (EXIT_FAILURE, "mkdir(%s,%o)", path, mode);
	}
}

void
Rmdir (const char *path)
{
	if (0 != rmdir (path) )
	{
		err (EXIT_FAILURE, "rmdir(%s)", path);
	}
}

int
main (int argc, char *argv[])
{
	Chroot ("/tmp/chroot");
	Chdir ("/");
	printcwd ();

	Mkdir ("foo", 0755);
	Chroot ("/foo");
	printcwd ();

	exit (EXIT_SUCCESS);
}

コンパイル

gcc chroot_hack.c


実行

% mkdir /tmp/chroot
% sudo ./a.out
/
/tmp/chroot


1つめのchrootしたあとに/にchdirし、getcwdすると、カレントは / になっている。
ここで mkdir foo を実行し、 /foo に chroot
して、カレントディレクトリを調べると /tmp/chroot になっている。
この状態からchdirで..を実行しても、親ディレクトリにはいけない。
さらにこの状態でmkdir barを実行すると/tmp/chroot/foo/barが作成される。

不思議だ。


スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー