From 62300e424d394f99dc35b49c19c2490d6a975d97 Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:16:00 +0100 Subject: [PATCH 1/6] Create a dynamic test out of the old one --- .../ios/MASVS-STORAGE/MASTG-TEST-0x53-1.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-1.md diff --git a/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-1.md b/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-1.md new file mode 100644 index 0000000000..0846007809 --- /dev/null +++ b/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-1.md @@ -0,0 +1,33 @@ +--- +platform: ios +title: Insertion of Sensitive Data into Logs +id: MASTG-TEST-0x53 +type: [dynamic] +weakness: MASWE-0001 +--- + +## Overview + +On iOS platform, logging APIs like NSLog, NSAssert, NSCAssert, print and printf can inadvertently lead to the leakage of sensitive information. Log messages are recorded in Console and you can access them by `Xcode` or `idevicesyslog`. Although other apps on the device cannot read these logs, direct logging is generally discouraged due to its potential for data leakage. + +In this test, we will use dynamic analysis to verify what data is logged to the Console. + +## Steps + +1. Install the app +2. Start recording the logs +3. Run the app +4. Navigate to the screen of the mobile app you want to analyse the log output from +5. Close the app + +## Observation + +The output should contain all logged data. + +## Evaluation + +The test case fails if you can find sensitive data inside the output. Ideally, a production app shouldn’t use any logging functions at all. + +### Mitigation + +Instead of using APIs such as `NSLog` or `print`, use a macro statement that you can easily disable in the release builds. From 15a3104733d7fe46f857b8fcb38471a627b9200d Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:17:57 +0100 Subject: [PATCH 2/6] Add a demo for the dynamic test --- .../MASTG-DEMO-0023/MASTG-DEMO-0023.md | 33 +++++++++++++++++++ .../MASTG-DEMO-0023/MastgTest.swift | 17 ++++++++++ .../MASVS-STORAGE/MASTG-DEMO-0023/output.txt | 9 +++++ .../ios/MASVS-STORAGE/MASTG-DEMO-0023/run.sh | 1 + 4 files changed, 60 insertions(+) create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MASTG-DEMO-0023.md create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/output.txt create mode 100755 demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/run.sh diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MASTG-DEMO-0023.md b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MASTG-DEMO-0023.md new file mode 100644 index 0000000000..4b34f7a137 --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MASTG-DEMO-0023.md @@ -0,0 +1,33 @@ +--- +platform: ios +title: Monitor secrets in logs +code: [swift] +id: MASTG-DEMO-0x53 +test: MASTG-TEST-0024 +--- + +### Sample + +The code snippet below shows sample code that logs a sensitive token. + +{{ MastgTest.swift }} + +### Steps + +1. Install the app +2. Run `run.sh` +3. Exercise the app to trigger the logging +4. Close the app +5. Press Ctrl+C to stop capturing the logs + +{{ run.sh }} + +### Observation + +The `output.txt` contains all logged strings. + +{{ output.txt }} + +### Evaluation + +The test fails because we can see `TOKEN=123` inside the logs. diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift new file mode 100644 index 0000000000..126940b09c --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift @@ -0,0 +1,17 @@ +import SwiftUI + +struct MastgTest { + + static func mastgTest(completion: @escaping (String) -> Void) { + + let token = "TOKEN=123" + + print("Leaking \(token) from print") + NSLog("Leaking \(token) from NSLog") + // Commented out for dynamic analysis because these APIs would crash + // assertionFailure("Leaking \(token) from assertionFailure") + // preconditionFailure("Leaking \(token) from preconditionFailure") + // assert(false, "Leaking \(token) from assert") + completion("Succesfully logged a token: \(token)") + } +} diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/output.txt b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/output.txt new file mode 100644 index 0000000000..2048863294 --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/output.txt @@ -0,0 +1,9 @@ +[connected] +Nov 5 13:29:17 MASTestApp(UIKitCore)[7234] : Sending UIEvent type: 0; subtype: 0; to window: ; contextId: 0x8FE81D3D +Nov 5 13:29:17 MASTestApp(libswiftFoundation.dylib)[7234] : Leaking TOKEN=123 from NSLog +Nov 5 13:29:17 SpringBoard(UIKitCore)[378] : Evaluating dispatch of UIEvent: 0x280f21a40; type: 0; subtype: 0; backing type: 11; shouldSend: 1 +Nov 5 13:29:17 SpringBoard(UIKitCore)[378] : Sending UIEvent type: 0; subtype: 0; to windows: 1 +Nov 5 13:29:17 SpringBoard(UIKitCore)[378] : Sending UIEvent type: 0; subtype: 0; to window: <_UISystemGestureWindow: 0x102f076f0>; +Nov 5 13:29:18 symptomsd(SymptomEvaluator)[458] : Data Usage for online-auth-agent on flow 144852 - +Nov 5 13:29:18 symptomsd(SymptomEvaluator)[458] : NBSM: TCP metrics iteration:5603 since 30.00 secs +Nov 5 13:29:18 symptomsd(SymptomEvaluator)[458] : NBSM: TCP progress metrics score: 0, problem ratio: 0.00 (baseline: 0.00) diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/run.sh b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/run.sh new file mode 100755 index 0000000000..35348869f6 --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/run.sh @@ -0,0 +1 @@ +idevicesyslog > output.txt From f799bd465d16c963e249afe956e7bc99465a037e Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:18:26 +0100 Subject: [PATCH 3/6] Create a static test out of the old one --- .../ios/MASVS-STORAGE/MASTG-TEST-0x53-2.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-2.md diff --git a/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-2.md b/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-2.md new file mode 100644 index 0000000000..738afffe66 --- /dev/null +++ b/tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0x53-2.md @@ -0,0 +1,29 @@ +--- +platform: ios +title: Insertion of Sensitive Data into Logs +id: MASTG-TEST-0x53 +type: [static] +weakness: MASWE-0001 +--- + +## Overview + +On iOS platform, logging APIs like NSLog, NSAssert, NSCAssert, print and printf can inadvertently lead to the leakage of sensitive information. Log messages are recorded in Console and you can access them by `Xcode` or `idevicesyslog`. Although other apps on the device cannot read these logs, direct logging is generally discouraged due to its potential for data leakage + +In this test, we will use static analysis to verify whether an app has any logging API which takes sensitive data. + +## Steps + +1. Run a static analysis tool such as @MASTG-TOOL-0073 on the app binary and look for uses of logging api API. + +## Observation + +The output should include the location of all logging functions. Check the decompiled code to verify if they receive sensitive data as input. + +## Evaluation + +The test case fails if you can find the use of APIs such as `NSLog` or `print`. Ideally, a production app shouldn’t use any logging functions at all. + +### Mitigation + +Instead of using APIs such as `NSLog` or `print`, use a macro statement that you can easily disable in the release builds. From 47aca401bb63da3d81dfc5633212470da4a9a0ae Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:20:06 +0100 Subject: [PATCH 4/6] Add a demo for a static test --- .../MASTG-DEMO-0024/MASTG-DEMO-0024.md | 37 +++ .../MASVS-STORAGE/MASTG-DEMO-0024/MASTestApp | Bin 0 -> 210240 bytes .../MASTG-DEMO-0024/MastgTest.swift | 16 ++ .../MASTG-DEMO-0024/function.asm | 271 ++++++++++++++++++ .../MASTG-DEMO-0024/loggingApis.r2 | 18 ++ .../MASVS-STORAGE/MASTG-DEMO-0024/output.asm | 18 ++ .../ios/MASVS-STORAGE/MASTG-DEMO-0024/run.sh | 2 + 7 files changed, 362 insertions(+) create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTG-DEMO-0024.md create mode 100755 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTestApp create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/loggingApis.r2 create mode 100644 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/output.asm create mode 100755 demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/run.sh diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTG-DEMO-0024.md b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTG-DEMO-0024.md new file mode 100644 index 0000000000..6eb11b876a --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTG-DEMO-0024.md @@ -0,0 +1,37 @@ +--- +platform: ios +title: Uses of logging APIs with r2 +code: [swift] +id: MASTG-DEMO-0x53 +test: MASTG-TEST-0024 +--- + +### Sample + +The code snippet below shows sample code that logs a sensitive token. + +{{ MastgTest.swift }} + +### Steps + +1. Unzip the app package and locate the main binary file (@MASTG-TECH-0058), which in this case is `./Payload/MASTestApp.app/MASTestApp`. +2. Run `run.sh` to find all occurrences of `NSLog`. +3. Repeat the same steps as in `run.sh` using another such as e.g. `print`. + +{{ run.sh }} + +### Observation + +The `output.asm` contains location of `NSLog` usage in the binary. + +{{ output.asm }} + +Reading `output.asm` doesn't clearly show what arguments are passed to `NSLog`, so you can also make use of `function.asm` for a better overview. + +### Evaluation + +The test fails because there is a call to `NSLog` which takes the secret token as an argument. + +### Mitigation + +Instead of using APIs such as `NSLog` or `print`, use a macro statement that you can easily disable in the release builds. diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTestApp b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MASTestApp new file mode 100755 index 0000000000000000000000000000000000000000..01069661ab2893834e244489253e0379f00ef8b3 GIT binary patch literal 210240 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

glir?X|-|cizF;o*Qe&D1(SfQip!pd23 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 Void) { + + let token = "TOKEN=123" + + print("Leaking \(token) from print") + NSLog("Leaking \(token) from NSLog") + assertionFailure("Leaking \(token) from assertionFailure") + preconditionFailure("Leaking \(token) from preconditionFailure") + assert(false, "Leaking \(token) from assert") + completion("Succesfully logged a token: \(token)") + } +} diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm new file mode 100644 index 0000000000..86c3e90f14 --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm @@ -0,0 +1,271 @@ + ;-- section.0.__TEXT.__text: + ;-- func.100004000: + ; UNKNOWN XREF from segment.__TEXT @ +0xd0 + ; CALL XREF from sym.func.100005a1c @ 0x100005aac +┌ 1060: sym.__s10MASTestApp9MastgTestV05mastgD010completionyySSc_tFZ (int64_t arg1, int64_t arg2, int64_t arg_1f0h); +│ 0x100004000 sub sp, sp, 0x1f0 ; [00] -r-x section size 34468 named 0.__TEXT.__text +│ 0x100004004 stp x20, x19, [var_1d0h] +│ 0x100004008 stp x29, x30, [var_1e0h] +│ 0x10000400c add x29, var_1e0h +│ 0x100004010 stur x0, [var_bp_b0h] ; arg1 +│ 0x100004014 stur x1, [var_bp_a0h] ; arg2 +│ 0x100004018 movz w8, 0x8 +│ 0x10000401c mov x2, x8 +│ 0x100004020 str x2, [var_78h] +│ 0x100004024 adrp x8, segment.__DATA_CONST ; 0x100010000 +│ 0x100004028 ldr x8, [x8, 0x4b0] ; 0xcf ; 207 +│ 0x10000402c add x8, x8, 8 +│ 0x100004030 str x8, [var_40h] +│ 0x100004034 adrp x8, segment.__DATA_CONST ; 0x100010000 +│ 0x100004038 ldr x8, [x8, 0x3c0] ; 0xcf ; 207 +│ 0x10000403c str x8, [var_e8h] +│ 0x100004040 adrp x8, segment.__DATA_CONST ; 0x100010000 +│ 0x100004044 ldr x8, [x8, 0x480] ; 0xcf ; 207 +│ 0x100004048 str x8, [var_f0h] +│ 0x10000404c adrp x8, segment.__DATA_CONST ; 0x100010000 +│ 0x100004050 ldr x8, [x8, 0x4c8] ; 0xcf ; 207 +│ 0x100004054 stur x8, [var_bp_e8h] +│ 0x100004058 stur xzr, [var_0h] +│ 0x10000405c stur xzr, [var_0h_2] +│ 0x100004060 stur xzr, [var_0h_3] +│ 0x100004064 stur xzr, [var_0h_4] +│ 0x100004068 stur x0, [var_0h] ; arg1 +│ 0x10000406c stur x1, [var_0h_2] ; arg2 +│ 0x100004070 adrp x0, 0x10000c000 +│ 0x100004074 add x0, x0, 0xb90 ; 0x10000cb90 ; "TOKEN=123" +│ 0x100004078 movz w8, 0x9 +│ 0x10000407c mov x1, x8 +│ 0x100004080 movz w8, 0x1 +│ 0x100004084 stur w8, [var_d4h] +│ 0x100004088 and w2, w8, 1 +│ 0x10000408c bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004090 str x0, [var_e0h] +│ 0x100004094 mov x8, x1 +│ 0x100004098 ldr x1, [var_40h] ; 4 +│ 0x10000409c stur x8, [var_98h] +│ 0x1000040a0 stur x0, [var_0h_3] +│ 0x1000040a4 stur x8, [var_0h_4] +│ 0x1000040a8 movz w8, 0x1 +│ 0x1000040ac mov x0, x8 +│ 0x1000040b0 str x0, [var_c8h] +│ 0x1000040b4 bl sym Swift._allocateUninitializedArray(Builtin.Word) -> (Swift.Array, Builtin.RawPointer) ; sym.imp.Swift._allocateUninitializedArray_A__Builtin.Word______Swift.Array_A___Builtin.RawPointer_ +│ 0x1000040b8 str x0, [var_sp_38h] +│ 0x1000040bc mov x8, x1 +│ 0x1000040c0 ldr x1, [var_c8h] ; 0x4 ; 4 +│ 0x1000040c4 str x8, [var_30h] +│ 0x1000040c8 movz w8, 0x13 +│ 0x1000040cc mov x0, x8 +│ 0x1000040d0 str x0, [var_68h] +│ 0x1000040d4 bl sym Swift.DefaultStringInterpolation.init(literalCapacity: Swift.Int, interpolationCount: Swift.Int) -> Swift.DefaultStringInterpolation ; sym.imp.Swift.DefaultStringInterpolation.init_literalCapacity:_Swift.Int__interpolationCount:_Swift.Int_____Swift.DefaultStringInterpolation +│ 0x1000040d8 ldur w8, [var_d4h] +│ 0x1000040dc mov x9, x1 +│ 0x1000040e0 ldr x1, [var_78h] ; 0x4 ; 4 +│ 0x1000040e4 sub x20, var_bp_40h +│ 0x1000040e8 str x20, [var_18h] +│ 0x1000040ec stur x0, [var_bp_40h] +│ 0x1000040f0 stur x9, [var_38h] +│ 0x1000040f4 adrp x0, 0x10000c000 +│ 0x1000040f8 add x0, x0, 0xb9a ; 0x10000cb9a ; "Leaking " +│ 0x1000040fc str x0, [var_70h] +│ 0x100004100 and w2, w8, 1 +│ 0x100004104 bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004108 str x1, [var_8h] +│ 0x10000410c bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x100004110 ldr x20, [var_18h] ; 0x4 ; 4 +│ 0x100004114 ldr x0, [var_8h] ; 0x4 ; 4 +│ 0x100004118 bl sym.imp.swift_bridgeObjectRelease +│ 0x10000411c ldr x9, [var_e0h] ; 0x4 ; 4 +│ 0x100004120 ldr x1, [var_e8h] ; 0x4 ; 4 +│ 0x100004124 ldr x2, [var_f0h] ; 0x4 ; 4 +│ 0x100004128 ldur x3, [var_bp_e8h] +│ 0x10000412c ldur x8, [var_98h] +│ 0x100004130 sub x0, var_50h +│ 0x100004134 stur x9, [var_50h] +│ 0x100004138 stur x8, [var_0h_5] +│ 0x10000413c bl sym Swift.DefaultStringInterpolation.appendInterpolation(A) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendInterpolation_A_where_A:_Swift.CustomStringConvertible__A:_Swift.TextOutputStreamable__A_______ +│ 0x100004140 ldr x20, [var_18h] ; 0x4 ; 4 +│ 0x100004144 ldur w8, [var_d4h] +│ 0x100004148 adrp x0, 0x10000c000 +│ 0x10000414c add x0, x0, 0xba3 ; 0x10000cba3 ; " from print" +│ 0x100004150 movz w9, 0xb +│ 0x100004154 mov x1, x9 +│ 0x100004158 str x1, [var_88h] +│ 0x10000415c and w2, w8, 1 +│ 0x100004160 bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004164 str x1, [var_10h] +│ 0x100004168 bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x10000416c ldr x0, [var_10h] ; 0x4 ; 4 +│ 0x100004170 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004174 ldur x8, [var_bp_40h] +│ 0x100004178 str x8, [var_28h] +│ 0x10000417c ldur x0, [var_38h] +│ 0x100004180 str x0, [var_20h] +│ 0x100004184 bl sym.imp.swift_bridgeObjectRetain +│ 0x100004188 ldr x0, [var_18h] ; 0x4 ; 4 ; int64_t arg1 +│ 0x10000418c bl sym.__ss26DefaultStringInterpolationVWOh +│ 0x100004190 ldr x1, [var_20h] ; 0x4 ; 4 +│ 0x100004194 ldr x0, [var_28h] ; 0x4 ; 4 +│ 0x100004198 bl sym Swift.String.init(stringInterpolation: Swift.DefaultStringInterpolation) -> Swift.String ; sym.imp.Swift.String.init_stringInterpolation:_Swift.DefaultStringInterpolation_____Swift.String +│ 0x10000419c ldr x9, [var_30h] ; 0x4 ; 4 +│ 0x1000041a0 ldr x11, [var_e8h] ; 0x4 ; 4 +│ 0x1000041a4 mov x10, x0 +│ 0x1000041a8 ldr x0, [var_sp_38h] ; 0x4 ; 4 ; int64_t arg1 +│ 0x1000041ac mov x8, x1 +│ 0x1000041b0 ldr x1, [var_40h] ; 4 ; int64_t arg2 +│ 0x1000041b4 str x11, [x9, 0x18] +│ 0x1000041b8 str x10, [x9] +│ 0x1000041bc str x8, [x9, 8] +│ 0x1000041c0 bl sym.__ss27_finalizeUninitializedArrayySayxGABnlF +│ 0x1000041c4 str x0, [var_60h] +│ 0x1000041c8 bl sym.__ss5print_9separator10terminatoryypd_S2StFfA0_ +│ 0x1000041cc str x0, [var_48h] +│ 0x1000041d0 str x1, [var_58h] +│ 0x1000041d4 bl sym.__ss5print_9separator10terminatoryypd_S2StFfA1_ +│ 0x1000041d8 ldr x2, [var_58h] ; 0x4 ; 4 +│ 0x1000041dc mov x3, x0 +│ 0x1000041e0 ldr x0, [var_60h] ; 0x4 ; 4 +│ 0x1000041e4 mov x4, x1 +│ 0x1000041e8 ldr x1, [var_48h] ; 4 +│ 0x1000041ec str x4, [var_sp_50h] +│ 0x1000041f0 bl sym Swift.print(_: Any..., separator: Swift.String, terminator: Swift.String) -> () ; sym.imp.Swift.print__:_Any...__separator:_Swift.String__terminator:_Swift.String_______ +│ 0x1000041f4 ldr x0, [var_sp_50h] ; 0x4 ; 4 +│ 0x1000041f8 bl sym.imp.swift_bridgeObjectRelease +│ 0x1000041fc ldr x0, [var_58h] ; 0x4 ; 4 +│ 0x100004200 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004204 ldr x0, [var_60h] ; 0x4 ; 4 +│ 0x100004208 bl sym.imp.swift_bridgeObjectRelease +│ 0x10000420c ldr x0, [var_68h] ; 0x4 ; 4 +│ 0x100004210 ldr x1, [var_c8h] ; 0x4 ; 4 +│ 0x100004214 bl sym Swift.DefaultStringInterpolation.init(literalCapacity: Swift.Int, interpolationCount: Swift.Int) -> Swift.DefaultStringInterpolation ; sym.imp.Swift.DefaultStringInterpolation.init_literalCapacity:_Swift.Int__interpolationCount:_Swift.Int_____Swift.DefaultStringInterpolation +│ 0x100004218 ldur w8, [var_d4h] +│ 0x10000421c mov x10, x0 +│ 0x100004220 ldr x0, [var_70h] ; 0x4 ; 4 +│ 0x100004224 mov x9, x1 +│ 0x100004228 ldr x1, [var_78h] ; 0x4 ; 4 +│ 0x10000422c sub x20, var_bp_60h +│ 0x100004230 str x20, [var_sp_98h] +│ 0x100004234 stur x10, [var_bp_60h] +│ 0x100004238 stur x9, [var_bp_58h] +│ 0x10000423c and w2, w8, 1 +│ 0x100004240 bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004244 str x1, [var_80h] +│ 0x100004248 bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x10000424c ldr x20, [var_sp_98h] ; 0x4 ; 4 +│ 0x100004250 ldr x0, [var_80h] ; 0x4 ; 4 +│ 0x100004254 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004258 ldr x9, [var_e0h] ; 0x4 ; 4 +│ 0x10000425c ldr x1, [var_e8h] ; 0x4 ; 4 +│ 0x100004260 ldr x2, [var_f0h] ; 0x4 ; 4 +│ 0x100004264 ldur x3, [var_bp_e8h] +│ 0x100004268 ldur x8, [var_98h] +│ 0x10000426c sub x0, var_bp_70h +│ 0x100004270 stur x9, [var_bp_70h] +│ 0x100004274 stur x8, [var_0h_6] +│ 0x100004278 bl sym Swift.DefaultStringInterpolation.appendInterpolation(A) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendInterpolation_A_where_A:_Swift.CustomStringConvertible__A:_Swift.TextOutputStreamable__A_______ +│ 0x10000427c ldr x20, [var_sp_98h] ; 0x4 ; 4 +│ 0x100004280 ldr x1, [var_88h] ; 0x4 ; 4 +│ 0x100004284 ldur w8, [var_d4h] +│ 0x100004288 adrp x0, 0x10000c000 +│ 0x10000428c add x0, x0, 0xbaf ; 0x10000cbaf ; " from NSLog" +│ 0x100004290 and w2, w8, 1 +│ 0x100004294 bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004298 str x1, [var_90h] +│ 0x10000429c bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x1000042a0 ldr x0, [var_90h] ; 0x4 ; 4 +│ 0x1000042a4 bl sym.imp.swift_bridgeObjectRelease +│ 0x1000042a8 ldur x8, [var_bp_60h] +│ 0x1000042ac str x8, [var_a8h] +│ 0x1000042b0 ldur x0, [var_bp_58h] +│ 0x1000042b4 str x0, [var_a0h] +│ 0x1000042b8 bl sym.imp.swift_bridgeObjectRetain +│ 0x1000042bc ldr x0, [var_sp_98h] ; 0x4 ; 4 ; int64_t arg1 +│ 0x1000042c0 bl sym.__ss26DefaultStringInterpolationVWOh +│ 0x1000042c4 ldr x1, [var_a0h] ; 0x4 ; 4 +│ 0x1000042c8 ldr x0, [var_a8h] ; 0x4 ; 4 +│ 0x1000042cc bl sym Swift.String.init(stringInterpolation: Swift.DefaultStringInterpolation) -> Swift.String ; sym.imp.Swift.String.init_stringInterpolation:_Swift.DefaultStringInterpolation_____Swift.String +│ 0x1000042d0 str x0, [var_b0h] +│ 0x1000042d4 str x1, [var_c0h] +│ 0x1000042d8 adrp x0, sym.__METACLASS_DATA__TtC10MASTestAppP33_9471609302C95FC8EC1D59DD4CF2A2DB19ResourceBundleClass ; 0x100014000 +│ 0x1000042dc add x0, x0, 0xc8 ; 0x1000140c8 +│ ; sym.__ss7CVarArg_pMD ; int64_t arg1 +│ 0x1000042e0 bl sym.___swift_instantiateConcreteTypeFromMangledName +│ 0x1000042e4 mov x1, x0 +│ 0x1000042e8 movz x0, 0 +│ 0x1000042ec stur x0, [var_bp_e0h] +│ 0x1000042f0 bl sym Swift._allocateUninitializedArray(Builtin.Word) -> (Swift.Array, Builtin.RawPointer) ; sym.imp.Swift._allocateUninitializedArray_A__Builtin.Word______Swift.Array_A___Builtin.RawPointer_ +│ 0x1000042f4 ldr x1, [var_c0h] ; 0x4 ; 4 +│ 0x1000042f8 mov x2, x0 +│ 0x1000042fc ldr x0, [var_b0h] ; 0x4 ; 4 +│ 0x100004300 str x2, [var_b8h] +│ 0x100004304 bl sym.imp.Foundation.NSLog_Swift.String__Swift.CVarArg..._______ +│ 0x100004308 ldr x0, [var_b8h] ; 0x4 ; 4 +│ 0x10000430c bl sym.imp.swift_bridgeObjectRelease +│ 0x100004310 ldr x0, [var_c0h] ; 0x4 ; 4 +│ 0x100004314 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004318 ldur x0, [var_bp_a0h] +│ 0x10000431c bl sym.imp.swift_retain +│ 0x100004320 ldr x1, [var_c8h] ; 0x4 ; 4 +│ 0x100004324 movz w8, 0x1c +│ 0x100004328 mov x0, x8 +│ 0x10000432c str x0, [var_d0h] +│ 0x100004330 bl sym Swift.DefaultStringInterpolation.init(literalCapacity: Swift.Int, interpolationCount: Swift.Int) -> Swift.DefaultStringInterpolation ; sym.imp.Swift.DefaultStringInterpolation.init_literalCapacity:_Swift.Int__interpolationCount:_Swift.Int_____Swift.DefaultStringInterpolation +│ 0x100004334 ldur w8, [var_d4h] +│ 0x100004338 mov x9, x1 +│ 0x10000433c ldr x1, [var_d0h] ; 0x4 ; 4 +│ 0x100004340 sub x20, var_bp_80h +│ 0x100004344 stur x20, [var_bp_c8h] +│ 0x100004348 stur x0, [var_bp_80h] +│ 0x10000434c stur x9, [var_bp_78h] +│ 0x100004350 adrp x0, 0x10000c000 +│ 0x100004354 add x0, x0, 0xbc0 ; 0x10000cbc0 ; "Succesfully logged a token: " +│ 0x100004358 and w2, w8, 1 +│ 0x10000435c bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x100004360 str x1, [var_d8h] +│ 0x100004364 bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x100004368 ldur x20, [var_bp_c8h] +│ 0x10000436c ldr x0, [var_d8h] ; 0x4 ; 4 +│ 0x100004370 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004374 ldr x9, [var_e0h] ; 0x4 ; 4 +│ 0x100004378 ldr x1, [var_e8h] ; 0x4 ; 4 +│ 0x10000437c ldr x2, [var_f0h] ; 0x4 ; 4 +│ 0x100004380 ldur x3, [var_bp_e8h] +│ 0x100004384 ldur x8, [var_98h] +│ 0x100004388 sub x0, var_bp_90h +│ 0x10000438c stur x9, [var_bp_90h] +│ 0x100004390 stur x8, [var_0h_7] +│ 0x100004394 bl sym Swift.DefaultStringInterpolation.appendInterpolation(A) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendInterpolation_A_where_A:_Swift.CustomStringConvertible__A:_Swift.TextOutputStreamable__A_______ +│ 0x100004398 ldur x20, [var_bp_c8h] +│ 0x10000439c ldur x1, [var_bp_e0h] +│ 0x1000043a0 ldur w8, [var_d4h] +│ 0x1000043a4 adrp x0, 0x10000c000 +│ 0x1000043a8 add x0, x0, 0xc38 +│ 0x1000043ac and w2, w8, 1 +│ 0x1000043b0 bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String +│ 0x1000043b4 stur x1, [var_bp_d0h] +│ 0x1000043b8 bl sym Swift.DefaultStringInterpolation.appendLiteral(Swift.String) -> () ; sym.imp.Swift.DefaultStringInterpolation.appendLiteral_Swift.String_______ +│ 0x1000043bc ldur x20, [var_bp_a0h] +│ 0x1000043c0 ldur x0, [var_bp_d0h] +│ 0x1000043c4 bl sym.imp.swift_bridgeObjectRelease +│ 0x1000043c8 ldur x8, [var_bp_80h] +│ 0x1000043cc stur x8, [var_bp_b8h] +│ 0x1000043d0 ldur x0, [var_bp_78h] +│ 0x1000043d4 stur x0, [var_bp_c0h] +│ 0x1000043d8 bl sym.imp.swift_bridgeObjectRetain +│ 0x1000043dc ldur x0, [var_bp_c8h] ; int64_t arg1 +│ 0x1000043e0 bl sym.__ss26DefaultStringInterpolationVWOh +│ 0x1000043e4 ldur x1, [var_bp_c0h] +│ 0x1000043e8 ldur x0, [var_bp_b8h] +│ 0x1000043ec bl sym Swift.String.init(stringInterpolation: Swift.DefaultStringInterpolation) -> Swift.String ; sym.imp.Swift.String.init_stringInterpolation:_Swift.DefaultStringInterpolation_____Swift.String +│ 0x1000043f0 ldur x8, [var_bp_b0h] +│ 0x1000043f4 stur x1, [var_bp_a8h] +│ 0x1000043f8 blr x8 +│ 0x1000043fc ldur x0, [var_bp_a8h] +│ 0x100004400 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004404 ldur x0, [var_bp_a0h] +│ 0x100004408 bl sym.imp.swift_release +│ 0x10000440c ldur x0, [var_98h] +│ 0x100004410 bl sym.imp.swift_bridgeObjectRelease +│ 0x100004414 ldp x29, x30, [var_1e0h] +│ 0x100004418 ldp x20, x19, [var_1d0h] +│ 0x10000441c add sp, arg_1f0h +└ 0x100004420 ret diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/loggingApis.r2 b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/loggingApis.r2 new file mode 100644 index 0000000000..58747cdc5e --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/loggingApis.r2 @@ -0,0 +1,18 @@ +e asm.bytes = false +e scr.color=false +e asm.var=false + +!printf "Uses of NSLog:\n" +afl~NSLog + +!printf "\n" + +!printf "xrefs to NSLog:\n" +axt @ 0x10000c6a4 + +!printf "\n" +!printf "Invocation of NSLog:\n" + +pd-- 5 @ 0x100004304 + +pdf @ 0x1000042f4 > function.asm diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/output.asm b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/output.asm new file mode 100644 index 0000000000..f50ac77146 --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/output.asm @@ -0,0 +1,18 @@ +Uses of NSLog: +0x10000c6a4 1 12 sym.imp.Foundation.NSLog_Swift.String__Swift.CVarArg..._______ + +xrefs to NSLog: +(nofunc) 0x100000120 [UNKNOWN] invalid +sym.__s10MASTestApp9MastgTestV05mastgD010completionyySSc_tFZ 0x100004304 [CALL] bl sym.imp.Foundation.NSLog_Swift.String__Swift.CVarArg..._______ + +Invocation of NSLog: +│ 0x1000042f0 bl sym Swift._allocateUninitializedArray(Builtin.Word) -> (Swift.Array, Builtin.RawPointer) ; sym.imp.Swift._allocateUninitializedArray_A__Builtin.Word______Swift.Array_A___Builtin.RawPointer_ +│ 0x1000042f4 ldr x1, [var_c0h] ; 0x4 ; 4 +│ 0x1000042f8 mov x2, x0 +│ 0x1000042fc ldr x0, [var_b0h] ; 0x4 ; 4 +│ 0x100004300 str x2, [var_b8h] +│ 0x100004304 bl sym.imp.Foundation.NSLog_Swift.String__Swift.CVarArg..._______ +│ 0x100004308 ldr x0, [var_b8h] ; 0x4 ; 4 +│ 0x10000430c bl sym.imp.swift_bridgeObjectRelease +│ 0x100004310 ldr x0, [var_c0h] ; 0x4 ; 4 +│ 0x100004314 bl sym.imp.swift_bridgeObjectRelease diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/run.sh b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/run.sh new file mode 100755 index 0000000000..cdd92839ba --- /dev/null +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/run.sh @@ -0,0 +1,2 @@ +#!/bin/bash +r2 -q -i loggingApis.r2 -A MASTestApp > output.asm From b61bb6e0ae6c769bf8bde92f3685ead409ab748c Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:35:53 +0100 Subject: [PATCH 5/6] Add a deprecation note --- tests/ios/MASVS-STORAGE/MASTG-TEST-0053.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/ios/MASVS-STORAGE/MASTG-TEST-0053.md b/tests/ios/MASVS-STORAGE/MASTG-TEST-0053.md index 58ad6fc0df..26d87cd9aa 100644 --- a/tests/ios/MASVS-STORAGE/MASTG-TEST-0053.md +++ b/tests/ios/MASVS-STORAGE/MASTG-TEST-0053.md @@ -8,6 +8,8 @@ title: Checking Logs for Sensitive Data masvs_v1_levels: - L1 - L2 +status: deprecated +overed_by: [MASTG-TEST-0x53-1, MASTG-TEST-0x53-2] --- ## Overview From 048fa071d5501a1a4e567cbd1b7f1a2f0f8d733c Mon Sep 17 00:00:00 2001 From: Jan Seredynski Date: Tue, 5 Nov 2024 16:41:49 +0100 Subject: [PATCH 6/6] Fix spelling errors --- demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift | 2 +- demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift | 2 +- demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift index 126940b09c..8a69a66a2f 100644 --- a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0023/MastgTest.swift @@ -12,6 +12,6 @@ struct MastgTest { // assertionFailure("Leaking \(token) from assertionFailure") // preconditionFailure("Leaking \(token) from preconditionFailure") // assert(false, "Leaking \(token) from assert") - completion("Succesfully logged a token: \(token)") + completion("Successfully logged a token: \(token)") } } diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift index 96587221f7..b7cb0274d1 100644 --- a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/MastgTest.swift @@ -11,6 +11,6 @@ struct MastgTest { assertionFailure("Leaking \(token) from assertionFailure") preconditionFailure("Leaking \(token) from preconditionFailure") assert(false, "Leaking \(token) from assert") - completion("Succesfully logged a token: \(token)") + completion("Successfully logged a token: \(token)") } } diff --git a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm index 86c3e90f14..c508149c82 100644 --- a/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm +++ b/demos/ios/MASVS-STORAGE/MASTG-DEMO-0024/function.asm @@ -217,7 +217,7 @@ │ 0x100004348 stur x0, [var_bp_80h] │ 0x10000434c stur x9, [var_bp_78h] │ 0x100004350 adrp x0, 0x10000c000 -│ 0x100004354 add x0, x0, 0xbc0 ; 0x10000cbc0 ; "Succesfully logged a token: " +│ 0x100004354 add x0, x0, 0xbc0 ; 0x10000cbc0 ; "Successfully logged a token: " │ 0x100004358 and w2, w8, 1 │ 0x10000435c bl sym Swift.String.init(_builtinStringLiteral: Builtin.RawPointer, utf8CodeUnitCount: Builtin.Word, isASCII: Builtin.Int1) -> Swift.String ; sym.imp.Swift.String.init__builtinStringLiteral:_Builtin.RawPointer__utf8CodeUnitCount:_Builtin.Word__isASCII:_Builtin.Int1_____Swift.String │ 0x100004360 str x1, [var_d8h]