@@ -527,3 +527,64 @@ TEST_F(FileRegexMatchTest, Audit_TestPattern)
527527 ASSERT_TRUE (result.HasValue ());
528528 EXPECT_EQ (result.Value (), Status::Compliant);
529529}
530+
531+ TEST_F (FileRegexMatchTest, Audit_SymlinkFollow_1)
532+ {
533+ MakeTempfile (" test" );
534+ const auto targetFilename = mTempfiles .back ();
535+ const auto linkFilename = targetFilename + " .link" ;
536+
537+ AuditFileRegexMatchParams params;
538+ params.path = mTempdir ;
539+ params.filenamePattern = regex (" .*\\ .link" );
540+ params.matchOperation = Operation::Match;
541+ params.matchPattern = R"( ^test$)" ;
542+ params.behavior = Behavior::AtLeastOneExists;
543+
544+ ASSERT_EQ (0 , symlink (targetFilename.c_str (), linkFilename.c_str ()));
545+ auto result = AuditFileRegexMatch (params, mIndicators , mContext );
546+ EXPECT_EQ (0 , unlink (linkFilename.c_str ()));
547+ ASSERT_TRUE (result.HasValue ());
548+ EXPECT_EQ (result.Value (), Status::Compliant);
549+ }
550+
551+ TEST_F (FileRegexMatchTest, Audit_SymlinkFollow_2)
552+ {
553+ MakeTempfile (" test" );
554+ const auto targetFilename = mTempfiles .back ();
555+ const auto linkFilename = targetFilename + " .link" ;
556+
557+ AuditFileRegexMatchParams params;
558+ params.path = mTempdir ;
559+ params.filenamePattern = regex (" .*\\ .link" );
560+ params.matchOperation = Operation::Match;
561+ params.matchPattern = R"( ^foo$)" ; // pattern mismatch against 'test'
562+ params.behavior = Behavior::AtLeastOneExists;
563+
564+ ASSERT_EQ (0 , symlink (targetFilename.c_str (), linkFilename.c_str ()));
565+ auto result = AuditFileRegexMatch (params, mIndicators , mContext );
566+ EXPECT_EQ (0 , unlink (linkFilename.c_str ()));
567+ ASSERT_TRUE (result.HasValue ());
568+ EXPECT_EQ (result.Value (), Status::NonCompliant);
569+ }
570+
571+ TEST_F (FileRegexMatchTest, Audit_SymlinkFollow_Directory)
572+ {
573+ const auto targetDirectory = std::string (mTempdir ) + " /Audit_SymlinkFollow_Directory" ;
574+ const auto linkFilename = targetDirectory + " .link" ;
575+
576+ AuditFileRegexMatchParams params;
577+ params.path = mTempdir ;
578+ params.filenamePattern = regex (" .*\\ .link" );
579+ params.matchOperation = Operation::Match;
580+ params.matchPattern = R"( .*)" ;
581+ params.behavior = Behavior::NoneExist;
582+
583+ ASSERT_EQ (0 , mkdir (targetDirectory.c_str (), 0755 ));
584+ EXPECT_EQ (0 , symlink (targetDirectory.c_str (), linkFilename.c_str ()));
585+ auto result = AuditFileRegexMatch (params, mIndicators , mContext );
586+ EXPECT_EQ (0 , unlink (linkFilename.c_str ()));
587+ EXPECT_EQ (0 , rmdir (targetDirectory.c_str ()));
588+ ASSERT_TRUE (result.HasValue ());
589+ EXPECT_EQ (result.Value (), Status::Compliant);
590+ }
0 commit comments