0

Jailkitにいくつかの修正と拡張を加えようとしています。ソースは CVS バージョン管理されているので、GitHub に複製しました

これを設定するには、ユーザーのホーム ディレクトリを次の/etc/passwdように編集します。

/home/jail/./home/username

次に、関数は、文字列の右から左に最初の一致が見つかるまでgetjaildiras で渡されたものを読み取り、その左にあるものとその右にあるすべてのものに設定します。oldhomedir/./jaildirnewhomedir

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 ***
4

1 に答える 1

1

どのように呼びgetjaildirますか?

試してみたところ、正常に動作します。

int getjaildir(const char *oldhomedir, char **jaildir, char **newhomedir)
{
    *jaildir = "/home/jail";
    *newhomedir = "/home/username";
    return 1;
}

int main(int argc, char *argv[])
{
    char *ohome = "ohome";
    char *nhome = "nhome";
    char *jdir = "jdir";
    getjaildir(ohome, &jdir, &nhome);

    printf("%s:%s:%s\n", ohome, jdir, nhome);
}

出力:

ohome:/home/jail:/home/username

アップデート

私は oyur リンクを見ましたが、問題が何であるかがわかったと思います。を呼び出してパスワード構造を取得していますgepwnam。ただし、この関数は静的メモリを返すため、上書きしないでください。そのため、変更を開始する前に構造体を手動でコピーするか、独自のメモリを提供する必要があります。この方法の詳細については、http://linux.die.net/man/3/getpwnamを参照して を参照してくださいgetpwnam_r。基本的に、このメモリを事前に割り当てて、関数に渡します。指定したこのバッファにすべてのエントリが配置されるため、十分なメモリが割り当てられていることを確認する必要があります。それに応じてコードを変更すると、クラッシュすることはありません。

于 2013-06-06T06:40:44.827 に答える