Android N IOT Release 2 (NIT1.180611.010.B1)
syscall_filter: Add a small operand optimization

Since all <, <=, >, >= operands are unsigned, when the immediate fits in
32-bits (which should be the vast majority of the time), we can omit one
of the comparison that would normally occur. So, for

 arg1 >= K

That would be roughly translated to

 if (hi(arg1) > hi(K)) jump NEXT;
 if (hi(arg1) == hi(K) && lo(arg1) >= lo(K)) jump NEXT;
 jump KILL;

If the first check (|hi(arg1) > hi(K)|) fails, we then evaluate the
whole second expression. If |hi(K) == 0|, then the only value of
|hi(arg1)| for which it would fail would be if |hi(arg1) == 0|, so we
don't need to evaluate |hi(arg1) == hi(K)| at all, since we know that
it's always going to be true. In other words,

 // given that |hi(K) == 0|,
 if (hi(arg1) > 0) jump NEXT;
 // if the code gets here, |hi(arg1) == 0|.
 if (lo(arg1) >= lo(K)) jump NEXT;
 jump KILL;

The case for > is identical, and </<= get translated into >/>= since
cBPF only supports the latter two operators, which concludes the
proof of correctness for this optimization.

This saves one opcode.

Bug: 111726641
Test: make tests
Test: echo 'read: arg1 <= 0xbadc0ffee0ddf00d' | \
      ./parse_seccomp_policy --dump - | \
      ./libseccomp/tools/scmp_bpf_disasm
Test: echo 'read: arg1 <= 0xff' | ./parse_seccomp_policy --dump - | \
      ./libseccomp/tools/scmp_bpf_disasm

Change-Id: Ia00362ce92ff5e858c7366dab013e2db88c09818
4 files changed
tree: f760fce3adbf0afc846a41982ea243577c631047
  1. examples/
  2. linux-x86/
  3. test/
  4. tools/
  5. .clang-format
  6. .gitignore
  7. Android.bp
  8. arch.h
  9. bpf.c
  10. bpf.h
  11. CleanSpec.mk
  12. common.mk
  13. CPPLINT.cfg
  14. elfparse.c
  15. elfparse.h
  16. gen_constants-inl.h
  17. gen_constants.c
  18. gen_constants.sh
  19. gen_syscalls.c
  20. gen_syscalls.sh
  21. get_googletest.sh
  22. HACKING.md
  23. libconstants.h
  24. libminijail-private.h
  25. libminijail.c
  26. libminijail.h
  27. libminijail.pc.in
  28. libminijail_unittest.cc
  29. libminijailpreload.c
  30. libsyscalls.h
  31. LICENSE
  32. Makefile
  33. minijail0.1
  34. minijail0.5
  35. minijail0.c
  36. minijail0_cli.c
  37. minijail0_cli.h
  38. minijail0_cli_unittest.cc
  39. MODULE_LICENSE_BSD
  40. navbar.md
  41. NOTICE
  42. OWNERS
  43. parse_seccomp_policy.cc
  44. platform2_preinstall.sh
  45. PRESUBMIT.cfg
  46. PREUPLOAD.cfg
  47. README.md
  48. RELEASE.md
  49. scoped_minijail.h
  50. signal_handler.c
  51. signal_handler.h
  52. syscall_filter.c
  53. syscall_filter.h
  54. syscall_filter_unittest.cc
  55. syscall_filter_unittest_macros.h
  56. syscall_wrapper.c
  57. syscall_wrapper.h
  58. system.c
  59. system.h
  60. system_unittest.cc
  61. testrunner.cc
  62. util.c
  63. util.h
  64. util_unittest.cc
README.md

Minijail

The Minijail homepage & main repo is https://android.googlesource.com/platform/external/minijail/.

There might be other copies floating around, but this is the official one!

What is it?

Minijail is a sandboxing and containment tool used in Chrome OS, and Android. It provides an executable that can be used to launch and sandbox other programs, and a library that can be used by code to sandbox itself.

Getting The Code

You're one git clone away from happiness.

$ git clone https://android.googlesource.com/platform/external/minijail
$ cd minijail

Releases are tagged as linux-vXX: https://android.googlesource.com/platform/external/minijail/+refs

Building

See the HACKING.md document for more details.

Release Process

See the RELEASE.md document for more details.

Contact

We've got a couple of contact points.

Talks and Presentations

The following talk serves as a good introduction to Minijail and how it can be used.

Video, slides.

Example Usage

The Chromium OS project has a comprehensive sandboxing document that is largely based on Minijail.

After you play with the simple examples below, you should check that out.

Change root to any user

# id
uid=0(root) gid=0(root) groups=0(root),128(pkcs11)
# minijail0 -u jorgelo -g 5000 /usr/bin/id
uid=72178(jorgelo) gid=5000(eng) groups=5000(eng)

Drop root while keeping some capabilities

# minijail0 -u jorgelo -c 3000 -- /bin/cat /proc/self/status
Name: cat
...
CapInh: 0000000000003000
CapPrm: 0000000000003000
CapEff: 0000000000003000
CapBnd: 0000000000003000