Re: [PATCH] secilc: add basic test for policy optimization

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

 



On Fri, Mar 13, 2020 at 7:30 AM Ondrej Mosnacek <omosnace@xxxxxxxxxx> wrote:
>
> Add a simple test for secilc -O to make sure that it produces the
> expected output. This might produce some false positives when the output
> of secilc/checkpolicy changes slightly, in which case the expected CIL
> will need to be updated along with the change.
>
> The test should normally work even with a checkpolicy built from an
> older tree, as long as it produces the same CIL output, so it uses the
> checkpolicy it finds in PATH by default.
>
> The test policy is taken from an e-mail from James Carter [1] (converted
> to CIL). I have low creativity, so I encourage others to come up with a
> better alternative as a follow-up :)
>
> [1] https://lore.kernel.org/selinux/0480cc58-a4f4-bd0f-9edb-f2befe546578@xxxxxxxxxxxxx/
>
> Signed-off-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx>
> ---
>  secilc/.gitignore       |   2 +
>  secilc/Makefile         |   9 +++
>  secilc/opt-expected.cil | 139 +++++++++++++++++++++++++++++++++
>  secilc/opt-input.cil    | 169 ++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 319 insertions(+)
>  create mode 100644 secilc/opt-expected.cil
>  create mode 100644 secilc/opt-input.cil
>
> diff --git a/secilc/.gitignore b/secilc/.gitignore
> index 2d3ff405..164523b0 100644
> --- a/secilc/.gitignore
> +++ b/secilc/.gitignore
> @@ -7,3 +7,5 @@ file_contexts
>  docs/html
>  docs/pdf
>  docs/tmp
> +opt-actual.bin
> +opt-actual.cil
> diff --git a/secilc/Makefile b/secilc/Makefile
> index 16640098..12df982b 100644
> --- a/secilc/Makefile
> +++ b/secilc/Makefile
> @@ -13,6 +13,10 @@ SECIL2CONF_OBJS := $(patsubst %.c,%.o,$(SECIL2CONF_SRCS))
>  SECILC_MANPAGE = secilc.8
>  SECIL2CONF_MANPAGE = secil2conf.8
>  XMLTO = xmlto
> +DIFF = diff
> +
> +CHECKPOLICY = checkpolicy
> +POL_VERS = $(shell $(CHECKPOLICY) -V | cut -f 1 -d ' ')
>
>  CFLAGS ?= -Wall -Wshadow -Wextra -Wundef -Wmissing-format-attribute -Wcast-align -Wstrict-prototypes -Wpointer-arith -Wunused
>
> @@ -26,6 +30,9 @@ $(SECILC): $(SECILC_OBJS)
>
>  test: $(SECILC)
>         ./$(SECILC) test/policy.cil
> +       ./$(SECILC) -c $(POL_VERS) -O -M 1 -f /dev/null -o opt-actual.bin opt-input.cil
> +       $(CHECKPOLICY) -b -C -M -o opt-actual.cil opt-actual.bin >/dev/null
> +       $(DIFF) opt-expected.cil opt-actual.cil
>
>  $(SECIL2CONF): $(SECIL2CONF_OBJS)
>         $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
> @@ -58,6 +65,8 @@ clean:
>         rm -f file_contexts
>         rm -f $(SECILC_MANPAGE)
>         rm -f $(SECIL2CONF_MANPAGE)
> +       rm -f opt-actual.cil
> +       rm -f opt-actual.bin
>         $(MAKE) -C docs clean
>
>  relabel:
> diff --git a/secilc/opt-expected.cil b/secilc/opt-expected.cil
> new file mode 100644
> index 00000000..49e1c2a5
> --- /dev/null
> +++ b/secilc/opt-expected.cil

This file should be in secilc/test/

> @@ -0,0 +1,139 @@
> +(handleunknown deny)
> +(class cl01 (p01a p01b))
> +(class cl02 ())
> +(class cl03 (p03a p03b))
> +(class cl04 (p04a p04b))
> +(class clx (ioctl))
> +(classorder (cl01 cl02 cl03 cl04 clx))
> +(classcommon cl01 cm01)
> +(classcommon cl02 cm02)
> +(common cm01 (p11a p11b))
> +(common cm02 (p22a p22b))
> +(sid kernel)
> +(sid security)
> +(sid unlabeled)
> +(sidorder (kernel security unlabeled))
> +(defaultuser cl01 source)
> +(defaultuser cl02 source)
> +(defaultuser cl03 source)
> +(defaultrole cl01 source)
> +(defaulttype cl02 target)
> +(defaultrange cl03 target low-high)
> +(mls true)
> +(sensitivity s01)
> +(sensitivity s02)
> +(sensitivity s03)
> +(sensitivityorder (s01 s02 s03))
> +(category c01)
> +(category c02)
> +(category c03)
> +(categoryorder (c01 c02 c03))
> +(sensitivitycategory s02 (c01 c03))
> +(sensitivitycategory s03 ((range c01 c03)))
> +(mlsconstrain (cl01 (p01a)) (and (dom h1 h2) (domby l1 h1)))
> +(mlsvalidatetrans cl02 (or (eq l1 l2) (eq t3 tpo)))
> +(mlsvalidatetrans cl02 (or (eq l1 l2) (incomp l1 l2)))
> +(mlsvalidatetrans cl02 (or (eq u1 u2) (eq t3 tpo)))
> +(policycap network_peer_controls)
> +(policycap open_perms)
> +(typeattribute at02)
> +(boolean b01 false)
> +(boolean b02 true)
> +(type tp01)
> +(type tp02)
> +(type tp03c)
> +(type tp03p)
> +(type tp04)
> +(type tpo)
> +(type tpr1)
> +(type tpr2)
> +(type tpr3)
> +(type tpr4)
> +(type tpr5)
> +(type tpx)
> +(typebounds tp03p tp03c)
> +(typeattributeset at02 (tp01 tp02))
> +(typepermissive tp01)
> +(allow at02 tpo (cl02 (p22b)))
> +(allow at02 tpr1 (cl01 (p11a p01a p01b)))
> +(allow at02 tpr3 (cl01 (p11a p01a p01b)))
> +(allow tp01 self (cl01 (p11a p11b p01a p01b)))
> +(allow tp01 tpo (cl02 (p22a)))
> +(allow tp01 tpr1 (cl01 (p11b)))
> +(allow tp03c tpo (cl03 (p03a)))
> +(allow tp03p tpo (cl03 (p03a p03b)))
> +(allow tp04 tpx (clx (ioctl)))
> +(auditallow tp01 tpo (cl01 (p01a)))
> +(dontaudit at02 tpr2 (cl01 (p11a p01a p01b)))
> +(dontaudit at02 tpr4 (cl01 (p11a p01a p01b)))
> +(dontaudit tp01 tpo (cl01 (p01b)))
> +(dontaudit tp01 tpr2 (cl01 (p11b)))
> +(allowx tp04 tpx (ioctl clx ((0x1234))))
> +(auditallowx tp04 tpx (ioctl clx ((0x9911))))
> +(dontauditx tp04 tpx (ioctl clx ((0x9922))))
> +(typetransition tp01 tpo cl01 tp02)
> +(typemember tp01 tpo cl02 tp02)
> +(typechange tp01 tpo cl03 tp02)
> +(typetransition tp01 tpo cl04 file01 tp02)
> +(rangetransition tp01 tpo cl01 ((s02) (s02)))
> +(rangetransition tp01 tpo cl02 ((s02) (s03 (c01 c02))))
> +(booleanif b01
> +    (true
> +        (allow tp01 tpr3 (cl01 (p11b)))
> +        (allow tp01 tpr5 (cl01 (p11a p11b p01a p01b)))
> +        (allow tp02 tpr5 (cl01 (p11a p01a)))
> +        (dontaudit tp01 tpr4 (cl01 (p11b)))
> +    )
> +    (false
> +        (allow at02 tpr5 (cl01 (p11a p01a p01b)))
> +    )
> +)
> +(role auditadm_r)
> +(role object_r)
> +(role rl01)
> +(role rl02)
> +(role rl03c)
> +(role rl03p)
> +(role secadm_r)
> +(roletype rl01 tp01)
> +(roletype rl01 tp02)
> +(roletype rl02 tp02)
> +(roletype rl03c tp03c)
> +(roletype rl03p tp03p)
> +(roletype object_r tp01)
> +(roletype object_r tp02)
> +(roletype object_r tp03c)
> +(roletype object_r tp03p)
> +(roletype object_r tp04)
> +(roletype object_r tpo)
> +(roletype object_r tpr1)
> +(roletype object_r tpr2)
> +(roletype object_r tpr3)
> +(roletype object_r tpr4)
> +(roletype object_r tpr5)
> +(roletype object_r tpx)
> +(roletransition rl01 tpo cl01 rl02)
> +(roleallow rl01 rl02)
> +(user us01)
> +(userrole us01 object_r)
> +(userrole us01 rl01)
> +(userlevel us01 (s01))
> +(userrange us01 ((s01) (s03 ((range c01 c03)))))
> +(constrain (cl01 (p01b)) (not (and (eq t1 tpo) (neq u1 u2))))
> +(validatetrans cl02 (or (eq u1 u2) (eq r1 r2)))
> +(sidcontext kernel (us01 rl01 tp01 ((s01) (s03 ((range c01 c03))))))
> +(sidcontext security (us01 rl01 tp01 ((s01) (s02))))
> +(sidcontext unlabeled (us01 rl01 tp01 ((s02 (c01 c03)) (s03 (c01 c03)))))
> +(fsuse xattr fs01 (us01 rl01 tp01 ((s01) (s01))))
> +(fsuse trans fs03 (us01 rl01 tp01 ((s01) (s01))))
> +(fsuse task fs02 (us01 rl01 tp01 ((s01) (s01))))
> +(genfscon fs04 / (us01 rl01 tp01 ((s01) (s01))))
> +(portcon udp 1000 (us01 rl01 tp01 ((s01) (s01))))
> +(portcon tcp 2000 (us01 rl01 tp01 ((s01) (s01))))
> +(portcon dccp 3000 (us01 rl01 tp01 ((s01) (s01))))
> +(portcon udp (1001 1009) (us01 rl01 tp01 ((s01) (s01))))
> +(portcon tcp (2001 2009) (us01 rl01 tp01 ((s01) (s01))))
> +(portcon dccp (3001 3009) (us01 rl01 tp01 ((s01) (s01))))
> +(netifcon if01 (us01 rl01 tp01 ((s01) (s01))) (us01 rl01 tp02 ((s01) (s01))))
> +(nodecon (10.0.0.1) (255.255.255.0) (us01 rl01 tp01 ((s01) (s01))))
> +(nodecon (fc00::1) (fc00::ffff) (us01 rl01 tp01 ((s01) (s01))))
> diff --git a/secilc/opt-input.cil b/secilc/opt-input.cil
> new file mode 100644
> index 00000000..8951360b
> --- /dev/null
> +++ b/secilc/opt-input.cil

Same for this one. It should be in secilc/test/

I can trim these policies and make them smaller. I'll send you smaller versions.

Thanks,
Jim



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux