Jailkitにいくつかの修正と拡張を加えようとしています。ソースは CVS バージョン管理されているので、GitHub に複製しました。
これを設定するには、ユーザーのホーム ディレクトリを次の/etc/passwd
ように編集します。
/home/jail/./home/username
次に、関数は、文字列の右から左に最初の一致が見つかるまでgetjaildir
as で渡されたものを読み取り、その左にあるものとその右にあるすべてのものに設定します。oldhomedir
/./
jaildir
newhomedir
jaildir
構成ファイルの値でオーバーライドできるようにしたいのですがc
、私は苦手なので、変数を手動で設定することさえ非常に困難です。
関数は次のとおりです。
/* if it returns 1 it will allocate new memory for jaildir and newhomedir
* else it will return 0
*/
int getjaildir(const char *oldhomedir, char **jaildir, char **newhomedir) {
int i=strlen(oldhomedir);
/* we will not accept /./ as jail, so we continue looking while i > 4 (minimum then is /a/./ )
* we start at the end so if there are multiple /path/./path2/./path3 the user will be jailed in the most minimized path
*/
while (i > 4) {
/* DEBUG_MSG("oldhomedir[%d]=%c\n",i,oldhomedir[i]);*/
if (oldhomedir[i] == '/' && oldhomedir[i-1] == '.' && oldhomedir[i-2] == '/') {
DEBUG_MSG("&oldhomedir[%d]=%s\n",i,&oldhomedir[i]);
*jaildir = strndup(oldhomedir, i-2);
*newhomedir = strdup(&oldhomedir[i]);
return 1;
}
i--;
}
return 1;
}
より複雑な解決策を何度も試みた後、非常に単純なハードコードされたバリエーションを試しました。
int getjaildir(const char *oldhomedir, char **jaildir, char **newhomedir) {
*jaildir = "/home/jail";
*newhomedir = "/home/username";
return 1;
}
これはLinuxでは問題なくコンパイルされますが、実行するとSegmentation fault (11)
. 私はポインター、アドレス、逆参照、変数の型、文字列の連結などについて調べましたが、残念ながら私は緩く型付けされた言語に慣れているので、これはかなり難しいです。私は何を間違っていますか?
アップデート
関数で値を設定する代わりにgetjaildir
、メールループで値を設定しようとしています。
ループの先頭には、変数の定義があります。
char *jaildir=NULL, *newhome=NULL, *shell=NULL;
そして、それらを設定する関数が呼び出される場所は次のとおりです。
if (!getjaildir(pw->pw_dir, &jaildir, &newhome)) {
syslog(LOG_ERR, "abort, failed to read the jail and the home from %s for user %s (%d)",pw->pw_dir, pw->pw_name, getuid());
exit(17);
}
値を上書きするために、すぐにこれを行うことはできますか?
jaildir="/home/jail";
newhome="/home/testuser";
これを試すと、次のようになります。
*** glibc detected *** -su: munmap_chunk(): invalid pointer: 0x00000000004046ee ***