├── security-check.jpg ├── SecurityCheck ├── SecurityCheck-Prefix.pch ├── SecurityCheck.h ├── debugCheckTemplate.h ├── jailbreakCheckTemplate.h ├── jailbreakCheck.h ├── forkCheck.h ├── jailbreakCheckTemplate.m ├── debugCheckTemplate.m ├── libASM.h ├── readSys.s ├── debugCheck.h └── fileCheck.h ├── .gitignore ├── LICENSE.txt ├── SecurityCheck.podspec ├── README.md └── SecurityCheck.xcodeproj └── project.pbxproj /security-check.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-imas/security-check/HEAD/security-check.jpg -------------------------------------------------------------------------------- /SecurityCheck/SecurityCheck-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'SecurityCheck' target in the 'SecurityCheck' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | 20 | SecurityCheck/OSSecurity.h 21 | -------------------------------------------------------------------------------- /SecurityCheck/SecurityCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // SecurityCheck.h 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/26/13. 6 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 7 | // 8 | 9 | #ifndef SecurityCheck_SecurityCheck_h 10 | #define SecurityCheck_SecurityCheck_h 11 | 12 | #import "fileCheck.h" 13 | #import "forkCheck.h" 14 | #import "debugCheck.h" 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /SecurityCheck/debugCheckTemplate.h: -------------------------------------------------------------------------------- 1 | // 2 | // debugCheckTemplate.h 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/14/13. 6 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SecurityCheck.h" 12 | 13 | inline void weHaveAProblem() __attribute__((always_inline)); 14 | 15 | @interface debugCheckTemplate : NSObject 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /SecurityCheck/jailbreakCheckTemplate.h: -------------------------------------------------------------------------------- 1 | // 2 | // jailbreakCheckTemplate.h 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/26/13. 6 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SecurityCheck.h" 12 | 13 | inline void weHaveAProblem() __attribute__((always_inline)); 14 | 15 | @interface jailbreakCheckTemplate : NSObject 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /SecurityCheck/jailbreakCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // jailbreakCheck.h 3 | // SecurityCheck 4 | // 5 | // Created by Black, Gavin S. on 11/13/13. 6 | // Copyright (c) 2013 IMS. All rights reserved. 7 | // 8 | 9 | #ifndef SecurityCheck_jailbreakCheck_h 10 | #define SecurityCheck_jailbreakCheck_h 11 | typedef void (^cbBlock) (void); 12 | 13 | inline void initDetect() __attribute__((always_inline)); 14 | inline void weHaveAProblem() __attribute__((always_inline)); 15 | 16 | 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014 The MITRE Corporation 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /SecurityCheck/forkCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // forkCheck.h 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/26/13. 6 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 7 | // 8 | 9 | #ifndef SecurityCheck_forkCheck_h 10 | #define SecurityCheck_forkCheck_h 11 | 12 | #define checkFork(forkCb) { \ 13 | \ 14 | pid_t child = fork(); \ 15 | \ 16 | if (child == 0) { exit(0); } \ 17 | if (child > 0) { forkCb();} \ 18 | } 19 | 20 | #endif 21 | -------------------------------------------------------------------------------- /SecurityCheck.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'SecurityCheck' 3 | s.version = '1.0' 4 | s.license = 'Apache License 2.0' 5 | 6 | s.summary = 'Application-level attached debug detect and jailbreak checking' 7 | s.description = %[ 8 | The iMAS security-check security control offers a continuous jailbreak detect and debug attach checking. With this information, one can programatically decide to shutdown the app or other loss prevention techniques. 9 | ] 10 | s.homepage = 'https://github.com/project-imas/security-check' 11 | s.authors = { 12 | 'MITRE' => 'imas-proj-list@lists.mitre.org' 13 | } 14 | 15 | s.source = { 16 | :git => 'https://github.com/project-imas/security-check.git', 17 | :tag => s.version.to_s 18 | } 19 | s.source_files = 'SecurityCheck/*.{m,h,s}' 20 | s.exclude_files = 'SecurityCheck/*Template*' 21 | 22 | s.platform = :ios 23 | s.ios.deployment_target = '6.1' 24 | s.requires_arc = true 25 | end -------------------------------------------------------------------------------- /SecurityCheck/jailbreakCheckTemplate.m: -------------------------------------------------------------------------------- 1 | // 2 | // jailbreakCheckTemplate.m 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/26/13. 6 | // Copyright (c) 2013 MITRE. All rights reserved. 7 | // 8 | 9 | #import "jailbreakCheckTemplate.h" 10 | 11 | @interface jailbreakCheckTemplate () 12 | 13 | //-------------------------------- 14 | // Callback block from checks 15 | //-------------------------------- 16 | typedef void (^cbBlock) (void); 17 | 18 | @end 19 | 20 | @implementation jailbreakCheckTemplate 21 | 22 | -(id) init { 23 | 24 | self = [super init]; 25 | 26 | if (nil != self) { 27 | 28 | //----------------------------------- 29 | // call weHaveAProblem 30 | //----------------------------------- 31 | cbBlock chkCallback = ^{ 32 | 33 | __weak id weakSelf = self; 34 | 35 | if (weakSelf) weHaveAProblem(); 36 | }; 37 | 38 | //----------------------------------- 39 | // jailbreak detection 40 | //----------------------------------- 41 | checkFork(chkCallback); 42 | checkFiles(chkCallback); 43 | checkLinks(chkCallback); 44 | } 45 | 46 | return self; 47 | } 48 | 49 | 50 | @end 51 | 52 | //-------------------------------------------------------------------- 53 | // if the device is jailbroken then this method will be called 54 | //-------------------------------------------------------------------- 55 | void weHaveAProblem() { 56 | 57 | printf("We have a problem - jailbroken!"); 58 | 59 | } -------------------------------------------------------------------------------- /SecurityCheck/debugCheckTemplate.m: -------------------------------------------------------------------------------- 1 | // 2 | // debugCheckTemplate.m 3 | // SecurityCheck 4 | // 5 | // This is an example of how to implementing the debugCheck 6 | // 7 | // Created by ct on 2/14/13. 8 | // Copyright (c) 2013 MITRE. All rights reserved. 9 | // 10 | 11 | #import "debugCheckTemplate.h" 12 | 13 | @interface debugCheckTemplate () 14 | 15 | //-------------------------------- 16 | // Callback block from debugCheck 17 | //-------------------------------- 18 | typedef void (^cbBlock) (void); 19 | 20 | @end 21 | 22 | @implementation debugCheckTemplate 23 | 24 | -(id) init { 25 | 26 | self = [super init]; 27 | 28 | if (nil != self) { 29 | 30 | 31 | //------------------------------------------- 32 | // do not allow debuggers 33 | //------------------------------------------- 34 | dbgStop; 35 | 36 | //------------------------------------------- 37 | // check for the presence of a debugger 38 | // call weHaveAProblem if there is one 39 | //------------------------------------------- 40 | cbBlock dbChkCallback = ^{ 41 | 42 | __weak id weakSelf = self; 43 | 44 | if (weakSelf) weHaveAProblem(); 45 | 46 | }; 47 | 48 | dbgCheck(dbChkCallback); 49 | } 50 | 51 | return self; 52 | } 53 | 54 | 55 | 56 | @end 57 | 58 | //-------------------------------------------------------------------- 59 | // if a debugger is attched to the app then this method will be called 60 | //-------------------------------------------------------------------- 61 | void weHaveAProblem() { 62 | 63 | printf("We have a problem - debugger attached!"); 64 | 65 | } -------------------------------------------------------------------------------- /SecurityCheck/libASM.h: -------------------------------------------------------------------------------- 1 | //--------------------------------------------------------------------------- 2 | // libASM.h: Assembly language macros for setting up functions . 3 | //--------------------------------------------------------------------------- 4 | // Create some macros to generate the start and end of my assembly functions 5 | // that can be called from C code. 6 | // WARNING: These functions don't allow more than 4 arguments in each function. 7 | // For more than 4 arguments, you need a stack frame for arguments after the 4th. 8 | 9 | #if defined(__LP64__) 10 | 11 | .macro BEGIN_FUNCTION 12 | .align 2 // Align the function code to a 8-byte (2^n) word boundary. 13 | .globl _$0 // Make the function globally accessible. 14 | .no_dead_strip _$0 // Stop the optimizer from ignoring this function! 15 | .private_extern _$0 16 | _$0: // Declare the function. 17 | .endmacro 18 | 19 | .macro END_FUNCTION 20 | ret 21 | .endmacro 22 | 23 | #elif defined(__arm__) 24 | 25 | .macro BEGIN_FUNCTION 26 | .align 2 // Align the function code to a 4-byte (2^n) word boundary. 27 | .arm // Use ARM instructions instead of Thumb. 28 | .globl _$0 // Make the function globally accessible. 29 | .no_dead_strip _$0 // Stop the optimizer from ignoring this function! 30 | .private_extern _$0 31 | _$0: // Declare the function. 32 | .endmacro 33 | 34 | .macro BEGIN_FUNCTION_THUMB 35 | .align 2 // Align the function code to a 4-byte (2^n) word boundary. 36 | .thumb // Use THUMB-2 instrctions instead of ARM. 37 | .globl _$0 // Make the function globally accessible. 38 | .thumb_func _$0 // Use THUMB-2 for the following function. 39 | .no_dead_strip _$0 // Stop the optimizer from ignoring this function! 40 | .private_extern _$0 41 | _$0: // Declare the function. 42 | .endmacro 43 | 44 | .macro END_FUNCTION 45 | bx lr // Jump back to the caller. 46 | .endmacro 47 | 48 | // Store a 32-bit constant into a register. 49 | // eg: SET_REG r1, 0x11223344 50 | .macro SET_REG 51 | // Recommended for ARMv6+ because the number is stored inside the instruction: 52 | movw $0, #:lower16:$1 53 | movt $0, #:upper16:$1 54 | .endmacro 55 | 56 | //---------------------------------------------------------------------------// 57 | .macro IOS_INIT 58 | 59 | // Initialize this module so it can have code that is visible from iPhone with XCode. 60 | .syntax unified // Allow both ARM and Thumb-2 instructions 61 | .section __TEXT,__text,regular 62 | .section __TEXT,__textcoal_nt,coalesced 63 | .section __TEXT,__const_coal,coalesced 64 | .section __TEXT,__symbol_stub4,symbol_stubs,none,12 65 | .text 66 | .endmacro 67 | 68 | #endif -------------------------------------------------------------------------------- /SecurityCheck/readSys.s: -------------------------------------------------------------------------------- 1 | #include "libASM.h" 2 | 3 | #if defined(__arm64__) 4 | 5 | //------ AArch64 registers used: 6 | // 7 | // x0-x7 input/result 8 | // x18 platform save 9 | // x19-x28 callee saved save 10 | // x29(FP) frame pointer save 11 | // x30(LR) link reg save 12 | // 13 | // d8-d15 callee saved save 14 | // 15 | 16 | BEGIN_FUNCTION readSys 17 | // I don't think this needs more registers saved/restored in prologue/epilogue? 18 | // Caller should have saved any needed, and sysctl will save any callee-saved. 19 | // x16 is assumed caller saved already 20 | // x4-x5 are parameter registers, and we only need to expect x0-x3 for sysctl, 21 | // so we should be able zero x4-x5 safely 22 | 23 | // prologue 24 | stp fp, lr, [sp, #-16]! 25 | add fp, sp, #0 26 | 27 | mov x4, #0 28 | mov x5, #0 29 | mov x16, #202 30 | svc #128 31 | 32 | //epilogue 33 | ldp fp, lr, [sp], #16 // restore state 34 | 35 | END_FUNCTION 36 | 37 | #elif defined(__arm__) 38 | 39 | //------ AArch32 registers used: 40 | // r0: arg0 & result (input & output parameters) 41 | // r1: arg1 (input parameter) 42 | // r2: 43 | // r3: 44 | // r4: (must restore if modified) 45 | // r5: (must restore if modified) 46 | // r6: (must restore if modified) 47 | // r7: * Frame Pointer in iOS (dont touch!) 48 | // r8: (must restore if modified) 49 | // r9: 50 | // r10: (must restore if modified) 51 | // r11: (must restore if modified) 52 | // r12: 53 | // r13: * Stack Pointer (dont touch!) 54 | // r14: (must restore if modified) 55 | // r15: * Program Counter (dont touch!) 56 | 57 | BEGIN_FUNCTION readSys 58 | // --------------- 59 | // prolog 60 | // --------------- 61 | push {r4,r5,r6, r7,lr} // Save registers r4-r6 if used and Frame Pointer (r7) and Link Register (r14). 62 | add r7, sp,#12 // Adjust FP to point to the saved FP (r7). 63 | push {r8,r10,r11,r14} // Save any general registers that should be preserved. 64 | vstmdb sp!, {d8-d15} // Save any VFP or NEON registers that should be preserved (S16-S31 / Q4-Q7). 65 | sub sp, sp,#4 // Allocate space for some local storage (optional). 66 | 67 | mov r4, #0 68 | mov r5, #0 69 | mov r8, #0 70 | mov r9, #0 71 | 72 | mov r12, #202 73 | svc #128 74 | 75 | // --------------- 76 | // epilog 77 | // --------------- 78 | add sp, sp,#4 // Deallocate space for some local storage (optional). 79 | vldmia sp!, {d8-d15} // Restore any VFP or NEON registers that should be preserved (S16-S31 / Q4-Q7). 80 | pop {r8,r10,r11,r14} // Restore any general registers that were saved. 81 | pop {r4,r5,r6, r7,pc} // Restore saved registers, the saved FP (r7), and return to the caller (saved LR as PC). 82 | 83 | END_FUNCTION 84 | 85 | #endif 86 | -------------------------------------------------------------------------------- /SecurityCheck/debugCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // debugCheck.h 3 | // 4 | // Created by ct on 1/30/13. 5 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 6 | // 7 | 8 | #ifndef debugMe_dbgChk_h 9 | #define debugMe_dbgChk_h 10 | 11 | #import 12 | 13 | #if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 14 | 15 | //------------------------------------------ 16 | // Assembly level interface to sysctl 17 | //------------------------------------------ 18 | 19 | #define sysCtlSz(nm,cnt,sz) readSys((int *)nm,cnt,NULL,sz) 20 | #define sysCtl(nm,cnt,lst,sz) readSys((int *)nm,cnt,lst, sz) 21 | 22 | #else 23 | 24 | //------------------------------------------ 25 | // C level interface to sysctl 26 | //------------------------------------------ 27 | 28 | #define sysCtlSz(nm,cnt,sz) sysctl((int *)nm,cnt,NULL,sz,NULL,0) 29 | #define sysCtl(nm,cnt,lst,sz) sysctl((int *)nm,cnt,lst, sz,NULL,0) 30 | 31 | #endif 32 | 33 | int readSys(int *, u_int, void *, size_t *); 34 | 35 | #define debugCheckNameSz 17 36 | 37 | #define DBGCHK_P_TRACED 0x00000800 /* Debugged process being traced */ 38 | 39 | #define debugCheck(cb) { \ 40 | \ 41 | size_t sz = sizeof(struct kinfo_proc); \ 42 | \ 43 | struct kinfo_proc info; \ 44 | \ 45 | memset(&info, 0, sz); \ 46 | \ 47 | int name[4]; \ 48 | \ 49 | name [0] = CTL_KERN; \ 50 | name [1] = KERN_PROC; \ 51 | name [2] = KERN_PROC_PID; \ 52 | name [3] = getpid(); \ 53 | \ 54 | if (sysCtl(name,4,&info,&sz) != 0) exit(EXIT_FAILURE); \ 55 | \ 56 | if (info.kp_proc.p_flag & DBGCHK_P_TRACED) { \ 57 | \ 58 | dispatch_source_cancel(_timer); \ 59 | \ 60 | cb(); \ 61 | \ 62 | } \ 63 | } 64 | 65 | #define dbgCheck(cb) { \ 66 | \ 67 | dispatch_queue_t _queue = \ 68 | dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); \ 69 | \ 70 | dispatch_source_t _timer = \ 71 | dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER \ 72 | , 0 \ 73 | , 0 \ 74 | ,_queue); \ 75 | \ 76 | dispatch_source_set_timer(_timer \ 77 | ,dispatch_time(DISPATCH_TIME_NOW, 0) \ 78 | ,1.0 * NSEC_PER_SEC \ 79 | ,0.0 * NSEC_PER_SEC); \ 80 | \ 81 | dispatch_source_set_event_handler(_timer, ^{debugCheck(cb)}); \ 82 | \ 83 | dispatch_resume(_timer); \ 84 | } 85 | 86 | 87 | // check for PT_DENY_ATTACH == 31 88 | 89 | extern int ptrace(int request, pid_t pid, caddr_t addr, int data); 90 | 91 | #define dbgStop ptrace(31,0,0,0); 92 | 93 | #endif 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iMAS security-check[![analytics](http://www.google-analytics.com/collect?v=1&t=pageview&_s=1&dl=https%3A%2F%2Fgithub.com%2Fproject-imas%2Fsecurity-check&_u=MAC~&cid=1757014354.1393964045&tid=UA-38868530-1)]() 2 | 3 | ## Background 4 | 5 | The iMAS security-check security control offers a continuous jailbreak detect and debug attach checking. With this information, one can programatically decide to shutdown the app or other loss prevention techniques. The security control makes system calls at the application level — in particular, ptrace and getpid. 6 | 7 | 8 | 9 | 10 | ## Vulnerabilities Addressed 11 | 1. Debugger tool use 12 | - CWE-288: Authentication Bypass Using an Alternate Path or Channel 13 | 14 | ## Installation 15 | 16 | * Add security-check repository as a submodule to your project 17 | * `git submodule add git@github.com:project-imas/security-check.git vendor/security-check` 18 | * Drag SecurityCheck.xcodeproj into the your project as a subproject 19 | * Add SecurityCheck Framework to target’s build phase - target dependancies (use +) 20 | * Add libSecurityCheck.a to targets's build phase - link binary with libraries 21 | * include `#import ` in your code at the app delegate level to start 22 | 23 | ## Installation via CocoaPod 24 | 25 | * If you don't already have CocoaPods installed, do `$ sudo gem install cocoapods` in your terminal. (See the [CocoaPods website](http://guides.cocoapods.org/using/getting-started.html#getting-started) for details.) 26 | * In your project directory, do `pod init` to create a Podfile. 27 | * Add `pod 'SecurityCheck', :git => 'https://github.com/project-imas/security-check.git'` to your Podfile 28 | * Run `pod install` 29 | * Include `#import ` in your code at the app delegate level to start 30 | 31 | ## Usage 32 | 33 | Place the following code at the app delegate level and call it early to detect security problems before the core code runs. 34 | 35 | ``` 36 | //----------------------------------- 37 | // call back to weHaveAProblem 38 | //----------------------------------- 39 | cbBlock chkCallback = ^{ 40 | 41 | 42 | __weak id weakSelf = self; 43 | 44 | if (weakSelf) [weakSelf weHaveAProblem]; 45 | }; 46 | 47 | //----------------------------------- 48 | // jailbreak detection 49 | //----------------------------------- 50 | checkFork(chkCallback); 51 | checkFiles(chkCallback); 52 | checkLinks(chkCallback); 53 | 54 | dbgStop; 55 | dbgCheck(chkCallback); 56 | 57 | ... 58 | 59 | //** Note: Rename this function in your code 60 | - (void) weHaveAProblem { 61 | 62 | NSLog(@"weHaveAProblem in AppDelegate"); 63 | 64 | //** cause segfault 65 | //int *foo = (int*)-1; // make a bad pointer 66 | //printf("%d\n", *foo); // causes segfault 67 | 68 | //** OR launch blank, black colored window that hangs the user 69 | SViewController *sc = [[SViewController alloc] init]; 70 | _window.rootViewController = sc; 71 | [_window makeKeyAndVisible]; 72 | 73 | #if 1 74 | //** OR re-launch the splash screen, must be preceded by SViewController as that controller overwrites the rootcontroller 75 | //** which changes the app flow 76 | UIImageView *myImageView =[[UIImageView alloc] 77 | initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)]; 78 | 79 | myImageView.image=[UIImage imageNamed:@"Default.png"]; 80 | myImageView.tag=22; 81 | [self.window addSubview:myImageView ]; 82 | [myImageView release]; 83 | [self.window bringSubviewToFront:myImageView]; 84 | #endif 85 | 86 | //** OR make this thread stop and spin 87 | //volatile int dummy_side_effect; 88 | // 89 | //while (1) { dummy_side_effect = 0; } 90 | //NSLog(@"Never prints."); 91 | 92 | 93 | //** recommend not EXITing as foresics can easily find exit(0) and replace with NOP 94 | //exit(0); 95 | } 96 | 97 | ``` 98 | 99 | ## Sample App 100 | 101 | The sample application demonstrates the use of the security-check security control. 102 | 103 | [See the sample application here.](https://github.com/project-imas/SCSampleApp) 104 | 105 | ## License 106 | 107 | Copyright 2013 The MITRE Corporation, All Rights Reserved. 108 | 109 | Licensed under the Apache License, Version 2.0 (the "License"); 110 | you may not use this work except in compliance with the License. 111 | You may obtain a copy of the License at 112 | 113 | http://www.apache.org/licenses/LICENSE-2.0 114 | 115 | Unless required by applicable law or agreed to in writing, software 116 | distributed under the License is distributed on an "AS IS" BASIS, 117 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 118 | See the License for the specific language governing permissions and 119 | limitations under the License. 120 | 121 | 122 | -------------------------------------------------------------------------------- /SecurityCheck/fileCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // fileCheck.h 3 | // SecurityCheck 4 | // 5 | // Created by ct on 2/26/13. 6 | // Copyright (c) 2013 The MITRE Corporation. All rights reserved. 7 | // 8 | 9 | #ifndef SecurityCheck_FileCheck_h 10 | #define SecurityCheck_FileCheck_h 11 | 12 | #import 13 | 14 | #define FILENAME_PRIMER 230 15 | 16 | #define FILENAME_XOR(_key, _input, _length) \ 17 | \ 18 | for (size_t _i = 0; _i < _length; _i++) { _input[_i] ^= _key; } \ 19 | 20 | /* 21 | ------------------------------------------------ 22 | chkFiles 23 | ------------------------------------------------ 24 | /Applications/Cydia.app 25 | /Library/MobileSubstrate/MobileSubstrate.dylib 26 | /var/cache/apt 27 | /var/lib/apt 28 | /var/lib/cydia 29 | /var/log/syslog 30 | /var/tmp/cydia.log 31 | /bin/bash 32 | /bin/sh 33 | /usr/sbin/sshd 34 | /usr/libexec/ssh-keysign 35 | /etc/ssh/sshd_config 36 | /etc/apt 37 | 38 | */ 39 | 40 | #define checkFiles(fcb) { \ 41 | \ 42 | char chkFiles[] = { \ 43 | \ 44 | 201,167,150,150,138,143,133,135,146,143,137,136,149,201,165,159,130,143 \ 45 | ,135,200,135,150,150,0 \ 46 | ,200,171,142,133,149,134,149,158,200,170,136,133,142,139,130,180,146,133 \ 47 | ,148,147,149,134,147,130,200,170,136,133,142,139,130,180,146,133,148,147 \ 48 | ,149,134,147,130,201,131,158,139,142,133,0 \ 49 | ,199,158,137,154,199,139,137,139,128,141,199,137,152,156,0 \ 50 | ,198,159,136,155,198,133,128,139,198,136,153,157,0 \ 51 | ,197,156,139,152,197,134,131,136,197,137,147,142,131,139,0 \ 52 | ,196,157,138,153,196,135,132,140,196,152,146,152,135,132,140,0 \ 53 | ,195,154,141,158,195,152,129,156,195,143,149,136,133,141,194,128,131,139,0 \ 54 | ,194,143,132,131,194,143,140,158,133,0 \ 55 | ,193,140,135,128,193,157,134,0 \ 56 | ,192,154,156,157,192,156,141,134,129,192,156,156,135,139,0 \ 57 | ,223,133,131,130,223,156,153,146,149,136,149,147,223,131,131,152,221,155 \ 58 | ,149,137,131,153,151,158,0 \ 59 | ,222,148,133,146,222,130,130,153,222,130,130,153,149,174,146,158,159,151 \ 60 | ,152,150,0 \ 61 | ,221,151,134,145,221,147,130,134,0 \ 62 | ,0 \ 63 | }; \ 64 | \ 65 | struct stat fStat; \ 66 | \ 67 | char *fp = chkFiles; \ 68 | size_t flen = strlen(fp); \ 69 | int fxor = FILENAME_PRIMER; \ 70 | int fcnt = 0; \ 71 | \ 72 | while (flen) { \ 73 | \ 74 | fxor = FILENAME_PRIMER + fcnt; \ 75 | \ 76 | FILENAME_XOR(fxor, fp, flen); \ 77 | \ 78 | if (stat(fp, &fStat) == 0) { fcb(); } \ 79 | \ 80 | fp += flen + 1; \ 81 | flen = strlen(fp); \ 82 | \ 83 | fcnt++; \ 84 | } \ 85 | } 86 | 87 | /* 88 | ------------------------------------------------ 89 | chkLinks 90 | ------------------------------------------------ 91 | /Library/Ringtones 92 | /Library/Wallpaper 93 | /usr/arm-apple-darwin9 94 | /usr/include 95 | /usr/libexec 96 | /usr/share 97 | /Applications 98 | 99 | */ 100 | 101 | #define checkLinks(lcb) { \ 102 | \ 103 | char chkLinks[] = { \ 104 | \ 105 | 201,170,143,132,148,135,148,159,201,180,143,136,129,146,137,136,131 \ 106 | ,149,0 \ 107 | ,200,171,142,133,149,134,149,158,200,176,134,139,139,151,134,151,130 \ 108 | ,149,0 \ 109 | ,199,157,155,154,199,137,154,133,197,137,152,152,132,141,197,140,137 \ 110 | ,154,159,129,134,209,0 \ 111 | ,198,156,154,155,198,128,135,138,133,156,141,140,0 \ 112 | ,197,159,153,152,197,134,131,136,143,146,143,137,0 \ 113 | ,196,158,152,153,196,152,131,138,153,142,0 \ 114 | ,195,173,156,156,128,133,143,141,152,133,131,130,159,0 \ 115 | ,0 \ 116 | \ 117 | }; \ 118 | \ 119 | struct stat lStat; \ 120 | \ 121 | char *lp = chkLinks; \ 122 | size_t llen = strlen(lp); \ 123 | int lxor = FILENAME_PRIMER; \ 124 | int lcnt = 0; \ 125 | \ 126 | while (llen) { \ 127 | \ 128 | lxor = FILENAME_PRIMER + lcnt; \ 129 | \ 130 | FILENAME_XOR(lxor, lp, llen); \ 131 | \ 132 | if ( lstat(lp, &lStat) == 0) \ 133 | \ 134 | if (lStat.st_mode & S_IFLNK) { lcb(); } \ 135 | \ 136 | \ 137 | lp += llen + 1; \ 138 | llen = strlen(lp); \ 139 | \ 140 | lcnt++; \ 141 | } \ 142 | } 143 | 144 | #endif 145 | -------------------------------------------------------------------------------- /SecurityCheck.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 48965CF416F2044E00B14F8A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48965CF316F2044E00B14F8A /* Foundation.framework */; }; 11 | 48965D0B16F2052000B14F8A /* debugCheckTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 48965D0316F2052000B14F8A /* debugCheckTemplate.m */; }; 12 | 48965D0C16F2052000B14F8A /* jailbreakCheckTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 48965D0716F2052000B14F8A /* jailbreakCheckTemplate.m */; }; 13 | 48965D0D16F2052000B14F8A /* readSys.s in Sources */ = {isa = PBXBuildFile; fileRef = 48965D0916F2052000B14F8A /* readSys.s */; }; 14 | 48965D1116F2068C00B14F8A /* SecurityCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 48965D0A16F2052000B14F8A /* SecurityCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 48965D1216F2068C00B14F8A /* fileCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 48965D0416F2052000B14F8A /* fileCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 48965D1316F2068C00B14F8A /* forkCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 48965D0516F2052000B14F8A /* forkCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 48965D1416F2068C00B14F8A /* debugCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 48965D0116F2052000B14F8A /* debugCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXCopyFilesBuildPhase section */ 21 | 48965CEE16F2044E00B14F8A /* CopyFiles */ = { 22 | isa = PBXCopyFilesBuildPhase; 23 | buildActionMask = 2147483647; 24 | dstPath = "include/${PRODUCT_NAME}"; 25 | dstSubfolderSpec = 16; 26 | files = ( 27 | ); 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 48965CF016F2044E00B14F8A /* libSecurityCheck.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSecurityCheck.a; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 48965CF316F2044E00B14F8A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 35 | 48965CF716F2044E00B14F8A /* SecurityCheck-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SecurityCheck-Prefix.pch"; sourceTree = ""; }; 36 | 48965D0116F2052000B14F8A /* debugCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugCheck.h; sourceTree = ""; }; 37 | 48965D0216F2052000B14F8A /* debugCheckTemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugCheckTemplate.h; sourceTree = ""; }; 38 | 48965D0316F2052000B14F8A /* debugCheckTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = debugCheckTemplate.m; sourceTree = ""; }; 39 | 48965D0416F2052000B14F8A /* fileCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fileCheck.h; sourceTree = ""; }; 40 | 48965D0516F2052000B14F8A /* forkCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = forkCheck.h; sourceTree = ""; }; 41 | 48965D0616F2052000B14F8A /* jailbreakCheckTemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jailbreakCheckTemplate.h; sourceTree = ""; }; 42 | 48965D0716F2052000B14F8A /* jailbreakCheckTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = jailbreakCheckTemplate.m; sourceTree = ""; }; 43 | 48965D0816F2052000B14F8A /* libASM.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; path = libASM.h; sourceTree = ""; }; 44 | 48965D0916F2052000B14F8A /* readSys.s */ = {isa = PBXFileReference; explicitFileType = sourcecode.asm; fileEncoding = 4; path = readSys.s; sourceTree = ""; }; 45 | 48965D0A16F2052000B14F8A /* SecurityCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecurityCheck.h; sourceTree = ""; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | 48965CED16F2044E00B14F8A /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | 48965CF416F2044E00B14F8A /* Foundation.framework in Frameworks */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | 48965CE716F2044E00B14F8A = { 61 | isa = PBXGroup; 62 | children = ( 63 | 48965CF516F2044E00B14F8A /* SecurityCheck */, 64 | 48965CF216F2044E00B14F8A /* Frameworks */, 65 | 48965CF116F2044E00B14F8A /* Products */, 66 | ); 67 | sourceTree = ""; 68 | }; 69 | 48965CF116F2044E00B14F8A /* Products */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 48965CF016F2044E00B14F8A /* libSecurityCheck.a */, 73 | ); 74 | name = Products; 75 | sourceTree = ""; 76 | }; 77 | 48965CF216F2044E00B14F8A /* Frameworks */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 48965CF316F2044E00B14F8A /* Foundation.framework */, 81 | ); 82 | name = Frameworks; 83 | sourceTree = ""; 84 | }; 85 | 48965CF516F2044E00B14F8A /* SecurityCheck */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 48965D0A16F2052000B14F8A /* SecurityCheck.h */, 89 | 48965D0F16F2055400B14F8A /* JailbreakCheck */, 90 | 48965D0E16F2052900B14F8A /* DebugCheck */, 91 | 48965CF616F2044E00B14F8A /* Supporting Files */, 92 | ); 93 | path = SecurityCheck; 94 | sourceTree = ""; 95 | }; 96 | 48965CF616F2044E00B14F8A /* Supporting Files */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 48965CF716F2044E00B14F8A /* SecurityCheck-Prefix.pch */, 100 | ); 101 | name = "Supporting Files"; 102 | sourceTree = ""; 103 | }; 104 | 48965D0E16F2052900B14F8A /* DebugCheck */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 48965D0816F2052000B14F8A /* libASM.h */, 108 | 48965D0916F2052000B14F8A /* readSys.s */, 109 | 48965D0116F2052000B14F8A /* debugCheck.h */, 110 | 48965D0216F2052000B14F8A /* debugCheckTemplate.h */, 111 | 48965D0316F2052000B14F8A /* debugCheckTemplate.m */, 112 | ); 113 | name = DebugCheck; 114 | sourceTree = ""; 115 | }; 116 | 48965D0F16F2055400B14F8A /* JailbreakCheck */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 48965D0416F2052000B14F8A /* fileCheck.h */, 120 | 48965D0516F2052000B14F8A /* forkCheck.h */, 121 | 48965D0616F2052000B14F8A /* jailbreakCheckTemplate.h */, 122 | 48965D0716F2052000B14F8A /* jailbreakCheckTemplate.m */, 123 | ); 124 | name = JailbreakCheck; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXHeadersBuildPhase section */ 130 | 48965D1016F2067200B14F8A /* Headers */ = { 131 | isa = PBXHeadersBuildPhase; 132 | buildActionMask = 2147483647; 133 | files = ( 134 | 48965D1116F2068C00B14F8A /* SecurityCheck.h in Headers */, 135 | 48965D1216F2068C00B14F8A /* fileCheck.h in Headers */, 136 | 48965D1316F2068C00B14F8A /* forkCheck.h in Headers */, 137 | 48965D1416F2068C00B14F8A /* debugCheck.h in Headers */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | /* End PBXHeadersBuildPhase section */ 142 | 143 | /* Begin PBXNativeTarget section */ 144 | 48965CEF16F2044E00B14F8A /* SecurityCheck */ = { 145 | isa = PBXNativeTarget; 146 | buildConfigurationList = 48965CFE16F2044E00B14F8A /* Build configuration list for PBXNativeTarget "SecurityCheck" */; 147 | buildPhases = ( 148 | 48965CEC16F2044E00B14F8A /* Sources */, 149 | 48965CED16F2044E00B14F8A /* Frameworks */, 150 | 48965CEE16F2044E00B14F8A /* CopyFiles */, 151 | 48965D1016F2067200B14F8A /* Headers */, 152 | 48965D1516F2080600B14F8A /* Prepare Framework */, 153 | ); 154 | buildRules = ( 155 | ); 156 | dependencies = ( 157 | ); 158 | name = SecurityCheck; 159 | productName = SecurityCheck; 160 | productReference = 48965CF016F2044E00B14F8A /* libSecurityCheck.a */; 161 | productType = "com.apple.product-type.library.static"; 162 | }; 163 | /* End PBXNativeTarget section */ 164 | 165 | /* Begin PBXProject section */ 166 | 48965CE816F2044E00B14F8A /* Project object */ = { 167 | isa = PBXProject; 168 | attributes = { 169 | LastUpgradeCheck = 0460; 170 | ORGANIZATIONNAME = IMS; 171 | }; 172 | buildConfigurationList = 48965CEB16F2044E00B14F8A /* Build configuration list for PBXProject "SecurityCheck" */; 173 | compatibilityVersion = "Xcode 3.2"; 174 | developmentRegion = English; 175 | hasScannedForEncodings = 0; 176 | knownRegions = ( 177 | en, 178 | ); 179 | mainGroup = 48965CE716F2044E00B14F8A; 180 | productRefGroup = 48965CF116F2044E00B14F8A /* Products */; 181 | projectDirPath = ""; 182 | projectRoot = ""; 183 | targets = ( 184 | 48965CEF16F2044E00B14F8A /* SecurityCheck */, 185 | ); 186 | }; 187 | /* End PBXProject section */ 188 | 189 | /* Begin PBXShellScriptBuildPhase section */ 190 | 48965D1516F2080600B14F8A /* Prepare Framework */ = { 191 | isa = PBXShellScriptBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | ); 195 | inputPaths = ( 196 | ); 197 | name = "Prepare Framework"; 198 | outputPaths = ( 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | shellPath = /bin/sh; 202 | shellScript = "set -e\n\nmkdir -p \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n# Link the \"Current\" version to \"A\"\n/bin/ln -sfh A \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\"\n/bin/ln -sfh Versions/Current/Headers \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\"\n/bin/ln -sfh \"Versions/Current/${PRODUCT_NAME}\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\"\n\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\n# cause propagating rebuilds of files that import these headers.\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n"; 203 | }; 204 | /* End PBXShellScriptBuildPhase section */ 205 | 206 | /* Begin PBXSourcesBuildPhase section */ 207 | 48965CEC16F2044E00B14F8A /* Sources */ = { 208 | isa = PBXSourcesBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | 48965D0B16F2052000B14F8A /* debugCheckTemplate.m in Sources */, 212 | 48965D0C16F2052000B14F8A /* jailbreakCheckTemplate.m in Sources */, 213 | 48965D0D16F2052000B14F8A /* readSys.s in Sources */, 214 | ); 215 | runOnlyForDeploymentPostprocessing = 0; 216 | }; 217 | /* End PBXSourcesBuildPhase section */ 218 | 219 | /* Begin XCBuildConfiguration section */ 220 | 48965CFC16F2044E00B14F8A /* Debug */ = { 221 | isa = XCBuildConfiguration; 222 | buildSettings = { 223 | ALWAYS_SEARCH_USER_PATHS = NO; 224 | ARCHS = "$(ARCHS_STANDARD)"; 225 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 226 | CLANG_CXX_LIBRARY = "libc++"; 227 | CLANG_ENABLE_OBJC_ARC = YES; 228 | CLANG_WARN_CONSTANT_CONVERSION = YES; 229 | CLANG_WARN_EMPTY_BODY = YES; 230 | CLANG_WARN_ENUM_CONVERSION = YES; 231 | CLANG_WARN_INT_CONVERSION = YES; 232 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 233 | COPY_PHASE_STRIP = NO; 234 | DEAD_CODE_STRIPPING = NO; 235 | GCC_C_LANGUAGE_STANDARD = gnu99; 236 | GCC_DYNAMIC_NO_PIC = NO; 237 | GCC_OPTIMIZATION_LEVEL = 1; 238 | GCC_PREPROCESSOR_DEFINITIONS = ( 239 | "DEBUG=1", 240 | "$(inherited)", 241 | ); 242 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 243 | GCC_VERSION = com.apple.compilers.llvmgcc42; 244 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 245 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 246 | GCC_WARN_UNUSED_VARIABLE = YES; 247 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 248 | ONLY_ACTIVE_ARCH = YES; 249 | OTHER_CFLAGS = "-finline-limit=5000"; 250 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 251 | PUBLIC_HEADERS_FOLDER_PATH = "$(PROJECT_NAME)Headers"; 252 | SDKROOT = iphoneos; 253 | STRIP_STYLE = "non-global"; 254 | }; 255 | name = Debug; 256 | }; 257 | 48965CFD16F2044E00B14F8A /* Release */ = { 258 | isa = XCBuildConfiguration; 259 | buildSettings = { 260 | ALWAYS_SEARCH_USER_PATHS = NO; 261 | ARCHS = "$(ARCHS_STANDARD)"; 262 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 263 | CLANG_CXX_LIBRARY = "libc++"; 264 | CLANG_ENABLE_OBJC_ARC = YES; 265 | CLANG_WARN_CONSTANT_CONVERSION = YES; 266 | CLANG_WARN_EMPTY_BODY = YES; 267 | CLANG_WARN_ENUM_CONVERSION = YES; 268 | CLANG_WARN_INT_CONVERSION = YES; 269 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 270 | COPY_PHASE_STRIP = NO; 271 | DEAD_CODE_STRIPPING = NO; 272 | GCC_C_LANGUAGE_STANDARD = gnu99; 273 | GCC_OPTIMIZATION_LEVEL = 1; 274 | GCC_VERSION = com.apple.compilers.llvmgcc42; 275 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 276 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 277 | GCC_WARN_UNUSED_VARIABLE = YES; 278 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 279 | OTHER_CFLAGS = "-finline-limit=5000"; 280 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 281 | PUBLIC_HEADERS_FOLDER_PATH = "$(PROJECT_NAME)Headers"; 282 | SDKROOT = iphoneos; 283 | STRIP_STYLE = "non-global"; 284 | VALIDATE_PRODUCT = YES; 285 | }; 286 | name = Release; 287 | }; 288 | 48965CFF16F2044E00B14F8A /* Debug */ = { 289 | isa = XCBuildConfiguration; 290 | buildSettings = { 291 | DSTROOT = /tmp/SecurityCheck.dst; 292 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 293 | GCC_PREFIX_HEADER = "SecurityCheck/SecurityCheck-Prefix.pch"; 294 | GCC_VERSION = ""; 295 | OTHER_CFLAGS = ""; 296 | OTHER_CPLUSPLUSFLAGS = ""; 297 | OTHER_LDFLAGS = "-ObjC"; 298 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 299 | PRODUCT_NAME = "$(TARGET_NAME)"; 300 | SEPARATE_STRIP = NO; 301 | SKIP_INSTALL = YES; 302 | }; 303 | name = Debug; 304 | }; 305 | 48965D0016F2044E00B14F8A /* Release */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | DSTROOT = /tmp/SecurityCheck.dst; 309 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 310 | GCC_PREFIX_HEADER = "SecurityCheck/SecurityCheck-Prefix.pch"; 311 | GCC_VERSION = ""; 312 | OTHER_CFLAGS = ""; 313 | OTHER_CPLUSPLUSFLAGS = ""; 314 | OTHER_LDFLAGS = "-ObjC"; 315 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 316 | PRODUCT_NAME = "$(TARGET_NAME)"; 317 | SEPARATE_STRIP = NO; 318 | SKIP_INSTALL = YES; 319 | }; 320 | name = Release; 321 | }; 322 | /* End XCBuildConfiguration section */ 323 | 324 | /* Begin XCConfigurationList section */ 325 | 48965CEB16F2044E00B14F8A /* Build configuration list for PBXProject "SecurityCheck" */ = { 326 | isa = XCConfigurationList; 327 | buildConfigurations = ( 328 | 48965CFC16F2044E00B14F8A /* Debug */, 329 | 48965CFD16F2044E00B14F8A /* Release */, 330 | ); 331 | defaultConfigurationIsVisible = 0; 332 | defaultConfigurationName = Release; 333 | }; 334 | 48965CFE16F2044E00B14F8A /* Build configuration list for PBXNativeTarget "SecurityCheck" */ = { 335 | isa = XCConfigurationList; 336 | buildConfigurations = ( 337 | 48965CFF16F2044E00B14F8A /* Debug */, 338 | 48965D0016F2044E00B14F8A /* Release */, 339 | ); 340 | defaultConfigurationIsVisible = 0; 341 | defaultConfigurationName = Release; 342 | }; 343 | /* End XCConfigurationList section */ 344 | }; 345 | rootObject = 48965CE816F2044E00B14F8A /* Project object */; 346 | } 347 | --------------------------------------------------------------------------------