[apparmor] [PATCH] tests: Add more named pipe tests
Steve Beattie
steve at nxnw.org
Tue Jun 10 05:15:08 UTC 2014
On Thu, Jun 05, 2014 at 06:21:31PM -0500, Tyler Hicks wrote:
> Allow for the parent and child processes to change into separate hats to
> verify named pipe communications between hats with varying permissions.
>
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
Acked-by: Steve Beattie <steve at nxnw.org>
Some additional test dimensions to consider:
1) parent or child in a hat, but not the other
2) wrong access to the named pipe in one hat (e.g. requires read, given
write access)
Thanks!
> ---
> tests/regression/apparmor/named_pipe.c | 69 +++++++++++++++++++++++----------
> tests/regression/apparmor/named_pipe.sh | 37 +++++++++++++++---
> 2 files changed, 79 insertions(+), 27 deletions(-)
>
> diff --git a/tests/regression/apparmor/named_pipe.c b/tests/regression/apparmor/named_pipe.c
> index 382f779..8e1d1ad 100644
> --- a/tests/regression/apparmor/named_pipe.c
> +++ b/tests/regression/apparmor/named_pipe.c
> @@ -66,14 +66,6 @@ int do_parent (char * hat, char * file)
> {
> int fd;
>
> - fd=open(file, O_RDONLY, 0);
> - if (fd == -1){
> - fprintf(stderr, "FAIL: open read %s failed - %s\n",
> - file,
> - strerror(errno));
> - return 1;
> - }
> -
> /* change hat if hatname != nochange */
> if (strcmp(hat, "nochange") != 0){
> if (change_hat(hat, SD_ID_MAGIC+1) == -1){
> @@ -83,21 +75,28 @@ int do_parent (char * hat, char * file)
> }
> }
>
> - return(do_read(fd));
> -}
> -
> -int do_child (char * hat, char * file)
> -{
> - int fd;
> + if (alarm(5) != 0) {
> + fprintf(stderr, "FAIL: alarm already set\n");
> + exit(1);
> + }
>
> - fd=open(file, O_WRONLY, 0);
> + fd=open(file, O_RDONLY, 0);
> if (fd == -1){
> - fprintf(stderr, "FAIL: open write %s failed - %s\n",
> + fprintf(stderr, "FAIL: open read %s failed - %s\n",
> file,
> strerror(errno));
> return 1;
> }
>
> + alarm(0);
> +
> + return(do_read(fd));
> +}
> +
> +int do_child (char * hat, char * file)
> +{
> + int fd;
> +
> /* change hat if hatname != nochange */
> if (strcmp(hat, "nochange") != 0){
> if (change_hat(hat, SD_ID_MAGIC+1) == -1){
> @@ -107,22 +106,49 @@ int do_child (char * hat, char * file)
> }
> }
>
> + fd=open(file, O_WRONLY, 0);
> + if (fd == -1){
> + fprintf(stderr, "FAIL: open write %s failed - %s\n",
> + file,
> + strerror(errno));
> + return 1;
> + }
> +
> return (do_write(fd));
> }
>
> +pid_t pid = -1;
> +
> +void kill_child(void)
> +{
> + if (pid > 0)
> + kill(pid, SIGKILL);
> +}
> +
> +void sigalrm_handler(int sig)
> +{
> + fprintf(stderr, "FAIL: parent timed out waiting for child\n");
> + exit(1);
> +}
> +
> int main(int argc, char *argv[])
> {
> int rc;
> - pid_t pid;
> int waitstatus;
> int read_error = 0;
>
> - if (argc != 3){
> - fprintf(stderr, "usage: %s hatname filename\n",
> + if (argc != 4){
> + fprintf(stderr, "usage: %s parent_hatname child_hatname filename\n",
> argv[0]);
> return 1;
> }
>
> + if (signal(SIGALRM, sigalrm_handler) == SIG_ERR) {
> + fprintf(stderr, "FAIL: signal failed - %s\n",
> + strerror(errno));
> + exit(1);
> + }
> +
> pid = fork();
> if (pid == -1) {
> fprintf(stderr, "FAIL: fork failed - %s\n",
> @@ -130,7 +156,8 @@ int main(int argc, char *argv[])
> exit(1);
> } else if (pid != 0) {
> /* parent */
> - read_error = do_parent(argv[1], argv[2]);
> + atexit(kill_child);
> + read_error = do_parent(argv[1], argv[3]);
> rc = wait(&waitstatus);
> if (rc == -1){
> fprintf(stderr, "FAIL: wait failed - %s\n",
> @@ -139,7 +166,7 @@ int main(int argc, char *argv[])
> }
> } else {
> /* child */
> - exit(do_child(argv[1], argv[2]));
> + exit(do_child(argv[2], argv[3]));
> }
>
> if ((WIFEXITED(waitstatus) != 0) && (WEXITSTATUS(waitstatus) == 0)
> diff --git a/tests/regression/apparmor/named_pipe.sh b/tests/regression/apparmor/named_pipe.sh
> index 9253bd4..0b09daf 100755
> --- a/tests/regression/apparmor/named_pipe.sh
> +++ b/tests/regression/apparmor/named_pipe.sh
> @@ -22,38 +22,63 @@ bin=$pwd
>
> . $bin/prologue.inc
>
> -subtest=sub
> fifo=${tmpdir}/pipe
> +
> +subtest=sub
> okperm=rw
>
> +subparent=parent
> +okparent=r
> +
> +subchild=child
> +okchild=w
> +
> mknod ${fifo} p
>
> # NAMED PIPE - no confinement
>
> -runchecktest "NAMED PIPE (no confinement)" pass nochange ${fifo}
> +runchecktest "NAMED PIPE (no confinement)" pass nochange nochange ${fifo}
>
> # PIPE - confined.
>
> #rm -f ${fifo} && mknod ${fifo} p
> genprofile $fifo:${okperm}
> -runchecktest "NAMED PIPE RW (confinement)" pass nochange ${fifo}
> +runchecktest "NAMED PIPE RW (confinement)" pass nochange nochange ${fifo}
>
> # PIPE - confined - no access.
>
> #rm -f ${fifo} && mknod ${fifo} p
> genprofile
> -runchecktest "NAMED PIPE (confinement)" fail nochange ${fifo}
> +runchecktest "NAMED PIPE (confinement)" fail nochange nochange ${fifo}
>
> # PIPE - in a subprofile.
>
> #rm -f ${fifo} && mknod ${fifo} p
> genprofile ${fifo}:${okperm} hat:$subtest ${fifo}:${okperm}
>
> -runchecktest "NAMED PIPE RW (subprofile)" pass ${subtest} ${fifo}
> +runchecktest "NAMED PIPE RW (subprofile)" pass ${subtest} ${subtest} ${fifo}
>
> # PIPE - in a subprofile - no access
>
> #rm -f ${fifo} && mknod ${fifo} p
> genprofile ${fifo}:${okperm} hat:$subtest
>
> -runchecktest "NAMED PIPE (subprofile)" fail ${subtest} ${fifo}
> +runchecktest "NAMED PIPE (subprofile)" fail ${subtest} ${subtest} ${fifo}
> +
> +# PIPE - in separate subprofiles
> +
> +genprofile hat:$subparent ${fifo}:${okparent} hat:$subchild ${fifo}:${okchild}
> +
> +runchecktest "NAMED PIPE RW (parent & child subprofiles)" pass ${subparent} ${subchild} ${fifo}
> +
> +# PIPE - in separate subprofiles - no access for child
> +
> +genprofile hat:$subparent ${fifo}:${okparent} hat:$subchild
> +
> +runchecktest "NAMED PIPE R (parent & child subprofiles)" fail ${subparent} ${subchild} ${fifo}
> +
> +# PIPE - in separate subprofiles - no access for parent
> +
> +genprofile hat:$subparent hat:$subchild ${fifo}:${okchild}
> +
> +runchecktest "NAMED PIPE W (parent & child subprofiles)" fail ${subparent} ${subchild} ${fifo}
--
Steve Beattie
<sbeattie at ubuntu.com>
http://NxNW.org/~steve/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20140609/4d9db544/attachment.pgp>
More information about the AppArmor
mailing list