Re: sydbox and ia64

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Yu, Fenghua yazmış:
> >These functions more or less work fine, the two functions i need help
> >with are:
> >trace_set_string: Set a string argument of the system call.
> >  This function is used to change some path arguments to /dev/null so
> >  that the application running under sydbox thinks everything is fine
> >  but in reality it writes to /dev/null, not the actual file. We call
> >  this write predicted paths.
> >trace_fake_stat: Fake stat buffer of stat() call.
> >  This function is used to implement the so-called magic commands.
> >  When run under sydbox the stat()'ing the path /dev/sydbox returns the 
> >  faked stat buffer, not the actual one (which is failure because it
> >  doesn't exist.)
> >
> >Both of these functions use ptrace(PTRACE_POKEDATA, ...) to poke data to
> >child's memory area and both of these functions don't work as expected.
> >I suspect additional hackery is involved to make them work. I'd
> >appreciate if anyone with knowledge about ptrace() and itanium
> >processors be kind enough to look at this file and tell me what's wrong
> >:-].
> >Thanks in advance.
> >
> >
> >¹: These functions reside in trace.c which you can see here:
> >   http://github.com/alip/sydbox/blob/ia64/src/trace.c
> >   For those who want to clone the repository, the git url is:
> >   git://github.com/alip/sydbox.git
> >
> What is the error of using ptrace(PTRACE_POKEDDATA, ...)? Does it return -1 and errno? Or peeked data is not correct?
> 
ptrace(PTRACE_POKEDATA, ...) returns success but the peeked data isn't
correct. I was a bit wrong in my first email, trace_set_string does work
correctly. As an example:

#include <fcntl.h>
#include <stdio.h>

int main(void)
{
    char *dsw = "/dev/sydbox/write//";
    open(dsw, O_RDWR);
    fprintf(stderr, "%s\n", dsw);
    return 0;
}

This prints /dev/null when run under sydbox because trace_set_string is
called to replace the path with /dev/null. (If you're interested, this
is a magic command to add the path "/" to the list of write enabled
path prefixes.)

So far so good, trying a similar example now with stat:

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

int main(void)
{
    int ret;
    struct stat buf;

    ret = stat("/dev/sydbox", &buf);
    if (0 > ret)
        return 1;
    fprintf(stderr, "ret: %d\n", ret);
    fprintf(stderr, "isdir: %s\n", S_ISDIR(buf.st_mode) ? "yes" : "no");
    fprintf(stderr, "uid: %d, gid: %d\n", buf.st_uid, buf.st_gid);
    return 0;
}

Running this under sydbox on x86_64 gives:
ret: 0
isdir: yes
uid: 0, gid: 0
But on ia64 i get totally random results:
ret: 38
isdir: no
uid: 1610612736, gid: 1210

There's something unportable in trace_fake_stat() that i can't figure
out. Any help or pointers appreciated.
Thanks in advance.

> Thanks.
> 
> -Fenghua
> 

-- 
Regards,
Ali Polatel

Attachment: pgpwkdVtxBmtU.pgp
Description: PGP signature


[Index of Archives]     [Linux Kernel]     [Sparc Linux]     [DCCP]     [Linux ARM]     [Yosemite News]     [Linux SCSI]     [Linux x86_64]     [Linux for Ham Radio]

  Powered by Linux