[cfe-dev] A patch for chroot checker
章磊
ioripolo at gmail.com
Sat Sep 18 23:18:49 PDT 2010
Yes. I think it's what Coverity did, and this may cause many false
positives.
I got a example like this:
Event chroot_call: Called chroot: "chroot(&"/home/polo/chroot/")"
At conditional (1): "chroot(&"/home/polo/chroot/") != 0" taking false path
7 if (chroot("/home/polo/chroot/") != 0) {
8 perror("chroot");
9 return 0;
10 }
At conditional (2): "chdir(&"../../") != 0" taking true path
11 if (chdir("../../") != 0) {
Event chroot: Called function "perror" after chroot() but before calling
chdir("/")
12 perror("chdir");
13 return 0;
14 }
15 if (chdir("/") != 0) {
16 perror("chdir");
17 return 0;
18 }
19
20 char *arrays[]={"bash", NULL};
21 execvp("bash", arrays);
2010/9/19 Zhongxing Xu <xuzhongxing at gmail.com>
>
>
> 2010/9/19 章磊 <ioripolo at gmail.com>
>
>> Hi Zhongxing,
>>
>> Here are several simple examples( assume all function can successfully
>> execute ):
>>
>> - workding directory: /home/polo/test/chr
>>
>> chroot("/var/local/ftp"); // root changed.
>> chdir("../../"); // working directory changed to
>> "/home/polo/", it's out of the jail.
>> chdir("/"); // enter the jail. working directory
>> changed to "/var/local/ftp".
>> foo(); // call any other function, ok
>>
>> - workding directory: /home/polo/test/chr
>>
>> chroot("/var/local/ftp"); // root changed.
>> chdir("/"); // enter the jail. working directory
>> changed to "/var/local/ftp".
>> chdir("../../"); // working directory is still
>> "/var/local/ftp", can't escape from the jail.
>> foo(); // call any other function, ok
>>
>> - workding directory: /home/polo/test/chr
>>
>> chroot("/var/local/ftp"); // root changed.
>> chdir("../../"); // working directory changed to
>> "/home/polo/", it's out of the jail.
>> foo(); // call any other function, may
>> access files outside of the jail.
>>
>> Above is my understanding of chroot and chdir. So IMO the full state
>> transition is something like:
>>
>>
>> NO_CHROOT ---chroot(foo)--> ROOT_CHANGED ---------------chdir(/) -->
>> JAIL_ENTERED
>>
>> | |
>>
>> --chdir('..') --> ROOT_CHANGED --chdir('..')-->JAIL_ENTERED
>>
>> | |
>> --foo()
>> -->JAIL_BROKEN or bug --foo()-->JAIL_ENTERED
>>
>>
>>
>
> This FSM looks consistent with your examples. So when we have a call with
> the state being ROOT_CHANGED then should we emit a warning, isn't it?
>
>
>> 2010/9/18 Zhongxing Xu <xuzhongxing at gmail.com>
>>
>>
>>>
>>> 2010/9/17 章磊 <ioripolo at gmail.com>
>>>
>>> Hi Zhongxing,
>>>>
>>>> I think "use enums to represent the type state" it's ok for now, but i
>>>> am not sure it meets the needs in future if we need more precise analysis.
>>>>
>>>> More comments inline below.
>>>>
>>>> 2010/9/16 Zhongxing Xu <xuzhongxing at gmail.com>
>>>>
>>>> Hi Lei,
>>>>>
>>>>> Instead of introducing new symbols, how about use enums to represent
>>>>> the type state?
>>>>>
>>>>> For example, we could use the following states:
>>>>>
>>>>> NO_CHROOT, ROOT_CHANGED, JAIL_ENTERED, JAIL_BROKEN
>>>>>
>>>>> NO_CHROOT ---chroot(foo)--> ROOT_CHANGED ---chdir(/)--> JAIL_ENTERED
>>>>> |
>>>>>
>>>>> ------chdir('..')--> JAIL_BROKEN
>>>>>
>>>>
>>>> IMO, it's something like this:
>>>>
>>>>
>>>> NO_CHROOT ---chroot(foo)--> ROOT_CHANGED ---chdir(/) --> JAIL_ENTERED
>>>>
>>>> |
>>>>
>>>> ------chdir('..') --> ROOT_CHANGED
>>>> |
>>>>
>>>> ------foo() -->JAIL_BROKEN
>>>>
>>>> What you think?
>>>>
>>>
>>> Sorry, I'm not sure about this. Do you have any references that explain
>>> what you are checking for?
>>>
>>>
>>>>
>>>>
>>>>> These states are stored directly in the GDM and operated by the
>>>>> ChrootChecker. Is this sufficient for checking this?
>>>>>
>>>>
>>>> OK, I'll do this later.
>>>>
>>>>
>>>>>
>>>>> On Tue, Sep 14, 2010 at 4:09 PM, 章磊 <ioripolo at gmail.com> wrote:
>>>>>
>>>>>> hi, clang
>>>>>>
>>>>>> This patch try to check improper use of chroot.
>>>>>>
>>>>>> In order to implement this checker, i add a subclass (SymbolEnv) of
>>>>>> SymbolData to represent some environment variables. Now it contains only one
>>>>>> kind of environment variables(JailKind).Then adds several states to the Jail
>>>>>> Symbol.
>>>>>>
>>>>>> This is an experimental checker, and i don't know it is the right way
>>>>>> to do this stuff.
>>>>>>
>>>>>> I'll appreciate it if there are any advice about this patch.
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards!
>>>>>>
>>>>>> Lei Zhang
>>>>>>
>>>>>> _______________________________________________
>>>>>> cfe-dev mailing list
>>>>>> cfe-dev at cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Best regards!
>>>>
>>>> Lei Zhang
>>>>
>>>
>>>
>>
>>
>> --
>> Best regards!
>>
>> Lei Zhang
>>
>
>
--
Best regards!
Lei Zhang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100919/97fe48d9/attachment.html>
More information about the cfe-dev
mailing list