mirror of
https://github.com/google/santa.git
synced 2026-01-14 08:47:57 -05:00
* Initial structure for ES wrappers, enriched types, logging * Basic working ES and logging functionality * Add in oneTBB and thread-safe-lru deps * Added a bunch of enriched types * Auto-mute self when establishing ES client * Basic auth, tamper client. Syslog of all events. Basic compiler tracking. * Update copyright header blobs, convert some tabs to spaces * Auth result cache. Fix getting translocation path. * Added remaining cache methods * Add AuthResultCache to Recorder client. Cache now operates on es_file_t. * Hooked up SNTPrefixTree * Fix CompilerController for RENAME. Fix AllowList logging missing path. * Block loading Santa kext * Added device manager client * Properly log DiskAppear events * Fix build to adopt new adhoc build * Handle clearing cache on UNMOUNT events * Ignore other ES clients if configured * Remove SNTAllowlistInfo. Rename AllowList to Allowlist. Minor cleanup. * Recorder now logs asynchronously. Enricher now returns shared_ptrs. * Added File writer. Added timestamps to BasicStream serializer. * Skip calling stat in SNTFileInfo when path given by ES. * Fix build issue * Address draft PR feedback * santactl integrated, XPC works, fix file writer bug * Integrate syncservice. Start observing some config changes. * Add metrics service wrapper * Add metrics config observers and metrics interval reset. * Start better dependency control. Add Null logger support. * Added more deps * Added more deps * Fix issue where metric service wasn't starting * Add missing variant include * Fix missing parent proc name * Added googletest and new unit test macro * Started expanding AuthResultCacheTest * Properly mock EndpointSecurityAPI * Finished AuthResultCacheTest * bazelrc now builds all C++ as C++17. Added LoggerTest. * Add FileTest. Abstract some File constants to Logger. * Added Empty serializer test * Started work on BasicStringTest. Fixed some BasicString serialization bugs. * Added Unlink BasicString serialization test * Added some more tests. Commonized some test code * Finished BasicStringTest. Converted to XCTest. * Standardize esapi variable naming * Bubble up gTest expect failures to XCTest failures * AuthResultCacheTest now uses XCTest. Added common TestUtils.h * EmptyTest now uses XCTest. * FileTest now uses XCTest * LoggerTest now uses XCTest. Removed santa_unit_gtest bazel macro. * Added ClientTest * Add basic Enricher tests * Add MessageTest. Make more TestUtils. * Rename metrics to Metrics * Add MetricsTest. * Apply template pattern to Serializer * Add SNTDecisionCacheTest. * Add SNTCachedDecisionTest. * Testing with coveralls debug mode * Allow manual CI runs * Remove unused property * Started work on SNTEndpointSecurityClientTest. * WIP SNTEndpointSecurityClientTest, fix test run issue * Added more base ES client tests * Add more base ES client tests * Base ES client tests done. Added serializer utils/tests. Expanded basic string tests. * Add utils test to test suite * Add copy ctor. Add test output to bazel coverage. * Single thread bazel coverage * Updaload coverage file * Updaload coverage file * Old gen cov test * Restructure message handlers to enable better testability * Added enable tests for all ES clients * Made a single MockEndpointSecurityAPI class to share everywhere * Added most of SNTCompilerControllerTest * Cleanup SNTCompilerControllerTest * Started expanding Auth client test * Finished up the Authorizer tests * Move to using enum class for notify/auth instead of bool * WIP for tamper resistance test. ASAN issues. * Add OCMock patch to fix test issue on ARM Macs * Changed patches directory name to external_patches * Update WORKSPACE path * Finished up Tamper Resistance tests * Finished up Recorder tests. * Move SNTExecutionControllerTest to ObjC++ * Initial work to port SNTExecutionControllerTest * Finished porting SNTExecutionControllerTest. * Added SNTExecutionControllerTest to list of unit tests * Ported SNTEndpointSecurityDeviceManager. * Test cleanup, use MockESAPI expectation helpers * Verify SNTEndpointSecurityDeviceManager expectations differently * Test cleanup, omit gTest param list where unused * Log message cleanup * Rename SNTApplicationTest to santad_test.mm * Finished porting santad_test, formerly SNTApplicationTest * Fix SNTEndpointSecurityDeviceManager issues * Pulled in missed fixes. Updated tests. * Renamed lowercase filenames to match rest of codebase * Fix non-static dispatch_once_t, and noisy watching compiler log message * WIP Started process of removing components no longer used * WIP Continued process of removing components no longer used * BUILD file cleanup. Proto warning. Removed unused global * Rename SNTEventProvider to SNTEndpointSecurityEventHandler * Rename SNTEndpointSecurityEventHandler protocol * Remove EnableSysxCache option. Remove --quick flag used during dev. * Ran testing/fix.sh * Addmissing param to fix.sh that was omitting .mm files. * clang-format * Fix linter: find cmd missing .mm ext, git grep exclude patch files. * Use MakeESProcess default params in tests * Move variables to camelCase in objc classes * More case changes * Sanitize strings * Change dispatch queue priorities and standardize daemon queue naming * Exclude patch files in markdown check * Ensure string log messages end with newline * Fix BasicStringTest * Disable clang-format in code producing different results in local/remote versions * Moved to using date ranges in copyright notices as per current guidelines * Update Source/common/SNTConfigurator.h Suggestion adding whitespace in comment to fix clang-format mangling Co-authored-by: Russell Hancox <russellhancox@users.noreply.github.com> * Removed santa_panic macro used in one place * Updated comment about ES cachability * Pin oneTBB to specific commit * Address outstanding WORKSPACE 'canonical reproducible form' messages * Use string append instead of ostringstream due to benchmark results * Remove use of freind classes in EnrichedTypes.h * Added SNTKVOManager, removed observers from SNTConfigurator. * Fixed SNTEndpointSecurityRecorderTest class name * Reduce usage of the auto keyword * Each SNTKVOManager instance now adds its own observer * Replaced more auto keywords with real types. * Remove leftover code coverage debugging from ci.yml * Updated comment * Memoize SNTFileInfo sha256. Reduce some cache sizes. * Fix issue checking for translocated paths * Use more performant NSURL creation method * Fix lint issue * Address PR feedback * Use an array literal for kvo objects * Fix some clang tidy and import issues * Replace third party LRU cache with SantaCache for now * Fix clang tidy issues * Address PR feedback * Fix comment typo Co-authored-by: Pete Markowsky <pmarkowsky@users.noreply.github.com> * Added todo for when we adopt macOS 13 Co-authored-by: Russell Hancox <russellhancox@users.noreply.github.com> Co-authored-by: Pete Markowsky <pmarkowsky@users.noreply.github.com>
236 lines
6.4 KiB
Objective-C
236 lines
6.4 KiB
Objective-C
/// Copyright 2015-2022 Google Inc. All rights reserved.
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
|
|
#import <EndpointSecurity/EndpointSecurity.h>
|
|
#import <Foundation/Foundation.h>
|
|
|
|
@class MOLCodesignChecker;
|
|
|
|
///
|
|
/// Represents a binary on disk, providing access to details about that binary
|
|
/// such as the SHA-1, SHA-256, Info.plist and the Mach-O data.
|
|
///
|
|
@interface SNTFileInfo : NSObject
|
|
|
|
///
|
|
/// Designated initializer.
|
|
///
|
|
/// @param path The path of the file this instance is to represent. The path will be
|
|
/// converted to an absolute, standardized path if it isn't already.
|
|
/// @param error If an error occurred and nil is returned, this will be a pointer to an NSError
|
|
/// describing the problem.
|
|
///
|
|
- (instancetype)initWithPath:(NSString *)path error:(NSError **)error;
|
|
|
|
///
|
|
/// Convenience initializer.
|
|
///
|
|
/// @param esFile Pointer to an es_file_t provided by the EndpointSecurity framework.
|
|
/// Assumes that the path is a resolved path.
|
|
///
|
|
- (instancetype)initWithEndpointSecurityFile:(const es_file_t *)esFile error:(NSError **)error;
|
|
|
|
///
|
|
/// Convenience initializer.
|
|
///
|
|
/// @param path The path to the file this instance is to represent. The path will be
|
|
/// converted to an absolute, standardized path if it isn't already.
|
|
///
|
|
- (instancetype)initWithPath:(NSString *)path;
|
|
|
|
///
|
|
/// Initializer for already resolved paths.
|
|
///
|
|
/// @param path The path of the file this instance is to represent. The path will
|
|
/// not be converted and will be used as is. If the path is not a regular file this method will
|
|
/// return nil and fill in an error.
|
|
/// @param error If an error occurred and nil is returned, this will be a pointer to an NSError
|
|
/// describing the problem.
|
|
///
|
|
- (instancetype)initWithResolvedPath:(NSString *)path error:(NSError **)error;
|
|
|
|
///
|
|
/// @return Path of this file.
|
|
///
|
|
- (NSString *)path;
|
|
|
|
///
|
|
/// Hash this file with SHA-1 and SHA-256 simultaneously.
|
|
///
|
|
/// @param sha1 If not NULL, will be filled with the SHA-1 of the file.
|
|
/// @param sha256 If not NULL, will be filled with the SHA-256 of the file.
|
|
///
|
|
- (void)hashSHA1:(NSString **)sha1 SHA256:(NSString **)sha256;
|
|
|
|
///
|
|
/// @return SHA-1 hash of this binary.
|
|
///
|
|
- (NSString *)SHA1;
|
|
|
|
///
|
|
/// @return SHA-256 hash of this binary.
|
|
///
|
|
- (NSString *)SHA256;
|
|
|
|
///
|
|
/// @return The architectures included in this binary (e.g. x86_64, ppc).
|
|
///
|
|
- (NSArray *)architectures;
|
|
|
|
///
|
|
/// @return YES if this file is a Mach-O file.
|
|
///
|
|
- (BOOL)isMachO;
|
|
|
|
///
|
|
/// @return YES if this file contains multiple architectures.
|
|
///
|
|
- (BOOL)isFat;
|
|
|
|
///
|
|
/// @return YES if this file is an executable Mach-O file.
|
|
///
|
|
- (BOOL)isExecutable;
|
|
|
|
///
|
|
/// @return YES if this file is a dynamic library.
|
|
///
|
|
- (BOOL)isDylib;
|
|
|
|
///
|
|
/// @return YES if this file is a bundle executable (QuickLook/Spotlight plugin, etc.)
|
|
///
|
|
- (BOOL)isBundle;
|
|
|
|
///
|
|
/// @return YES if this file is a kernel extension.
|
|
///
|
|
- (BOOL)isKext;
|
|
|
|
///
|
|
/// @return YES if this file is a script (e.g. it begins #!).
|
|
///
|
|
- (BOOL)isScript;
|
|
|
|
///
|
|
/// @return YES if this file is an XAR archive.
|
|
///
|
|
- (BOOL)isXARArchive;
|
|
|
|
///
|
|
/// @return YES if this file is a disk image.
|
|
///
|
|
- (BOOL)isDMG;
|
|
|
|
///
|
|
/// @return NSString describing the kind of file (executable, bundle, script, etc.)
|
|
///
|
|
- (NSString *)humanReadableFileType;
|
|
|
|
///
|
|
/// @return YES if this file has a bad/missing __PAGEZERO .
|
|
///
|
|
- (BOOL)isMissingPageZero;
|
|
|
|
///
|
|
/// If set to YES, the bundle* and infoPlist methods will search for and use the highest NSBundle
|
|
/// found in the tree. Defaults to NO, which uses the first found bundle, if any.
|
|
///
|
|
/// @example:
|
|
/// An SNTFileInfo object that represents
|
|
/// /Applications/Photos.app/Contents/XPCServices/com.apple.Photos.librarychooserservice.xpc
|
|
/// useAncestorBundle is set to YES
|
|
/// /Applications/Photos.app will be used to get data backing all the bundle methods
|
|
///
|
|
/// @note: The NSBundle object backing the bundle* and infoPlist methods is cached once found.
|
|
/// Setting the useAncestorBundle propery will clear this cache and force a re-search.
|
|
///
|
|
@property(nonatomic) BOOL useAncestorBundle;
|
|
|
|
///
|
|
/// @return An NSBundle if this file is part of a bundle.
|
|
///
|
|
- (NSBundle *)bundle;
|
|
|
|
///
|
|
/// @return The path to the bundle this file is a part of, if any.
|
|
///
|
|
- (NSString *)bundlePath;
|
|
|
|
///
|
|
/// @return Either the Info.plist in the bundle this file is part of, or an embedded plist if there
|
|
/// is one. In the unlikely event that a file has both an embedded Info.plist and is part of a
|
|
/// bundle, the embedded plist will be returned.
|
|
///
|
|
- (NSDictionary *)infoPlist;
|
|
|
|
///
|
|
/// @return the CFBundleIdentifier from this file's Info.plist.
|
|
///
|
|
- (NSString *)bundleIdentifier;
|
|
|
|
///
|
|
/// @return the CFBundleName from this file's Info.plist.
|
|
///
|
|
- (NSString *)bundleName;
|
|
|
|
///
|
|
/// @return the CFBundleVersion from this file's Info.plist.
|
|
///
|
|
- (NSString *)bundleVersion;
|
|
|
|
///
|
|
/// @return the CFBundleShortVersionString from this file's Info.plist.
|
|
///
|
|
- (NSString *)bundleShortVersionString;
|
|
|
|
///
|
|
/// @return LaunchServices quarantine data - download URL as an absolute string.
|
|
///
|
|
- (NSString *)quarantineDataURL;
|
|
|
|
///
|
|
/// @return LaunchServices quarantine data - referer URL as an absolute string.
|
|
///
|
|
- (NSString *)quarantineRefererURL;
|
|
|
|
///
|
|
/// @return LaunchServices quarantine data - agent bundle ID.
|
|
///
|
|
- (NSString *)quarantineAgentBundleID;
|
|
|
|
///
|
|
/// @return LaunchServices quarantine data - timestamp.
|
|
///
|
|
- (NSDate *)quarantineTimestamp;
|
|
|
|
///
|
|
/// @return The size of the file in bytes.
|
|
///
|
|
- (NSUInteger)fileSize;
|
|
|
|
///
|
|
/// @return The underlying file handle.
|
|
///
|
|
@property(readonly) NSFileHandle *fileHandle;
|
|
|
|
///
|
|
/// @return Returns an instance of MOLCodeSignChecker initialized with the file's binary path.
|
|
/// Both the MOLCodesignChecker and any resulting NSError are cached and returned on subsequent
|
|
/// calls. You may pass in NULL for the error if you don't care to receive it.
|
|
///
|
|
- (MOLCodesignChecker *)codesignCheckerWithError:(NSError **)error;
|
|
|
|
@end
|