@@ -797,7 +797,7 @@ func TestAuditClientSetImmutable(t *testing.T) {
797797 assert .EqualValues (t , 2 , status .Enabled )
798798}
799799
800- func TestRuleParsing (t * testing.T ) {
800+ func TestValidRuleParsing (t * testing.T ) {
801801 var rules []string
802802 switch runtime .GOARCH {
803803 case "386" :
@@ -833,6 +833,20 @@ func TestRuleParsing(t *testing.T) {
833833 "-a always,user -F uid=root" ,
834834 "-a always,task -F uid=root" ,
835835 "-a always,exit -S mount -F pid=1234" ,
836+ "-d always,exit -F arch=b64 -S execve,execveat -F key=exec" ,
837+ "-d never,exit -F arch=b64 -S connect,accept,bind -F key=external-access" ,
838+ "-W /etc/group -p wa" ,
839+ "-W /etc/passwd -p rx" ,
840+ "-W /etc/gshadow -p rwxa" ,
841+ "-W /tmp/test -p rwa" ,
842+ "-d always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EACCES -F key=access" ,
843+ "-d never,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EPERM -F key=access" ,
844+ "-d always,exit -F arch=b32 -S open -F key=admin -F uid=root -F gid=root -F exit=33 -F path=/tmp -F perm=rwxa" ,
845+ "-d always,exit -F arch=b64 -S open -F key=key -F uid=30000 -F gid=333 -F exit=-151111 -F filetype=fifo" ,
846+ "-d never,exclude -F msgtype=GRP_CHAUTHTOK" ,
847+ "-d always,user -F uid=root" ,
848+ "-d always,task -F uid=root" ,
849+ "-d always,exit -S mount -F pid=1234" ,
836850 }
837851 default :
838852 // Can't have multiple syscall testing as ordering of individual syscalls
@@ -851,6 +865,19 @@ func TestRuleParsing(t *testing.T) {
851865 "-a always,user -F uid=root" ,
852866 "-a always,task -F uid=root" ,
853867 "-a always,exit -S mount -F pid=1234" ,
868+ "-d always,exit -S execve -F key=exec" ,
869+ "-W /etc/group -p wa" ,
870+ "-W /etc/passwd -p rx" ,
871+ "-W /etc/gshadow -p rwxa" ,
872+ "-W /tmp/test -p rwa" ,
873+ "-d always,exit -S all -F exit=-EACCES -F key=access" ,
874+ "-d never,exit -S all -F exit=-EPERM -F key=access" ,
875+ "-d always,exit -S open -F key=admin -F uid=root -F gid=root -F exit=33 -F path=/tmp -F perm=rwxa" ,
876+ "-d always,exit -S open -F key=key -F uid=30000 -F gid=333 -F exit=-151111 -F filetype=fifo" ,
877+ "-d never,exclude -F msgtype=GRP_CHAUTHTOK" ,
878+ "-d always,user -F uid=root" ,
879+ "-d always,task -F uid=root" ,
880+ "-d always,exit -S mount -F pid=1234" ,
854881 }
855882 }
856883 t .Logf ("checking %d rules" , len (rules ))
@@ -864,14 +891,113 @@ func TestRuleParsing(t *testing.T) {
864891 if err != nil {
865892 t .Fatal (err , msg )
866893 }
867- cmdline , err := rule .ToCommandLine (data , true )
894+ addRule := true
895+ switch r .TypeOf () {
896+ case rule .DeleteFileWatchRuleType , rule .DeleteSyscallRuleType :
897+ addRule = false
898+ }
899+ cmdline , err := rule .ToCommandLineAddRemove (data , true , addRule )
868900 if err != nil {
869901 t .Fatal (err , msg )
870902 }
871903 assert .Equal (t , line , cmdline , msg )
872904 }
873905}
874906
907+ func TestInvalidRuleParsing (t * testing.T ) {
908+ rules := []string {
909+ "-D -a" ,
910+ "-D -A" ,
911+ "-D -d" ,
912+
913+ "-D -a always" ,
914+ "-D -A always" ,
915+ "-D -d always" ,
916+
917+ "-D -a never" ,
918+ "-D -A never" ,
919+ "-D -d never" ,
920+
921+ "-D -a always,task" ,
922+ "-D -A always,task" ,
923+ "-D -d always,task" ,
924+
925+ "-D -a always,task -w /foo/bar -p rw" ,
926+ "-D -a always,task -W /foo/bar -p rw" ,
927+ "-D -A always,task -w /foo/bar -p rw" ,
928+ "-D -A always,task -W /foo/bar -p rw" ,
929+ "-D -d always,task -w /foo/bar -p rw" ,
930+ "-D -d always,task -W /foo/bar -p rw" ,
931+
932+ "-D -a never,task" ,
933+ "-D -A never,task" ,
934+ "-D -d never,task" ,
935+
936+ "-D -w /foo/bar" ,
937+ "-D -W /foo/bar" ,
938+ "-D -w /foo/bar -p rw" ,
939+ "-D -W /foo/bar -p rw" ,
940+ "-D -w /foo/bar -p garbage" ,
941+ "-D -W /foo/bar -p garbage" ,
942+
943+ "-w /foo/bar -W /foo/bar" ,
944+ "-w /foo/bar -W /foo/bar -p rw" ,
945+
946+ "-w foo/bar" ,
947+ "-W foo/bar" ,
948+ "-w foo/bar -p rw" ,
949+ "-W foo/bar -p rw" ,
950+
951+ "-w foo/bar -S 42" ,
952+ "-W foo/bar -S 42" ,
953+
954+ "-w foo/bar -W foo/bar" ,
955+ "-w foo/bar -W foo/bar -p rw" ,
956+
957+ "-w foo/bar -W foo/bar -S 42" ,
958+
959+ "-w /foo/bar -F uid=100" ,
960+ "-W /foo/bar -F uid=100" ,
961+
962+ "-w /foo/bar -S 42" ,
963+ "-W /foo/bar -S 42" ,
964+
965+ "-w /foo/bar -F uid=100" ,
966+ "-W /foo/bar -F uid=100" ,
967+
968+ "-w /foo/bar -C auid!=uid" ,
969+ "-W /foo/bar -C auid!=uid" ,
970+
971+ "-a always,exit -w /foo/bar -p rw" ,
972+ "-a always,exit -W /foo/bar -p rw" ,
973+ "-A always,exit -w /foo/bar -p rw" ,
974+ "-A always,exit -W /foo/bar -p rw" ,
975+
976+ "-a always,exit -w /foo/bar" ,
977+ "-a always,exit -W /foo/bar" ,
978+ "-A always,exit -w /foo/bar" ,
979+ "-A always,exit -W /foo/bar" ,
980+
981+ }
982+
983+ t .Logf ("checking %d rules" , len (rules ))
984+ for idx , line := range rules {
985+ r , err := flags .Parse (line )
986+ if err != nil {
987+ t .Log (err )
988+ continue
989+ }
990+
991+ _ , err = rule .Build (r )
992+ if err != nil {
993+ t .Log (err )
994+ continue
995+ }
996+
997+ t .Errorf ("parsing line #%d: `%s' should have failed" , idx , line )
998+ }
999+ }
1000+
8751001func extractDecimalNumber (s []int8 , pos int ) (value , nextPos int ) {
8761002 for value = 0 ; ; pos ++ {
8771003 c := s [pos ]
0 commit comments