Mostly safe โ a couple of notes worth reading.
Scanned 5/3/2026, 7:14:27 PMยทCached resultยทFast Scanยท45 rulesยทHow we decide โ
AIVSS Score
Low
Severity Breakdown
0
critical
0
high
60
medium
2
low
MCP Server Information
Findings
This package carries a B grade with a safety score of 61/100 and poses moderate security concerns, primarily around server configuration (26 findings), resource exhaustion risks (22 findings), and ANSI escape injection vulnerabilities (12 findings). While no critical or high-severity issues were detected, the 60 medium-severity findings suggest it needs hardening before production use, particularly in how it handles input validation and resource limits. Installation is acceptable for development or testing environments with the understanding that you should review configuration practices and input handling before deploying to production.
No known CVEs found for this package or its dependencies.
Scan Details
Want deeper analysis?
Fast scan found 62 findings using rule-based analysis. Upgrade for LLM consensus across 5 judges, AI-generated remediation, and cross-file taint analysis.
Building your own MCP server?
Same rules, same LLM judges, same grade. Private scans stay isolated to your account and never appear in the public registry. Required for code your team hasnโt shipped yet.
Showing 1โ30 of 62 findings
62 findings
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 75 | "timestamp": "21:11", |
| 76 | "title": "Handle DOM Response", |
| 77 | "language": "swift", |
| 78 | "code": "// Listen for authorization success.\ndocument.addEventListener('AppleIDSignInOnSuccess', (event) => {\n // Handle successful response.\n console.log(event.detail.data);\n});\n\n// Listen for authorization failures.\ndocument.addEventListener('AppleIDSignInOnFailure', (event) => {\n // Handle error.\n console.log(event.detail.error);\n});" |
| 79 | } |
| 80 | ], |
| 81 | "resources": { |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 20 | "timestamp": "6:02", |
| 21 | "title": "Register event handler", |
| 22 | "language": "swift", |
| 23 | "code": "import AccessorySetupKit\n\n// Create a session\nvar session = ASAccessorySession()\n\n// Activate session with event handler\nsession.activate(on: DispatchQueue.main, eventHandler: handleSessionEvent(event:))\n\n// Handle event\nfunc handleSessionEvent(event: ASAccessoryEvent) { \n switch event.eventType {\n case .activated:\n print(\"Session is activated and ready to use\")\n |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 20 | "timestamp": "5:42", |
| 21 | "title": "Function that retrieves a conversion tag from a URL", |
| 22 | "language": "swift", |
| 23 | "code": "func retrieveConversionTag(fromURL url: URL) -> String? {\n guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {\n print(\"Could not get components for URL.\")\n return nil\n }\n\n guard let queryItems = components.queryItems else {\n print(\"URL does not contain query items.\")\n return nil\n |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 22 | "timestamp": "8:23", |
| 23 | "title": "Friending API", |
| 24 | "language": "swift", |
| 25 | "code": "// Call Friend Requests API to present friend request view from a view controller, when player click on Add Friends Button in your game\nlet error = GKLocalPlayer.local\n.presentFriendRequestCreatorFromViewController(using: navigationController)\n\nif error != nil {\n print(\"Fail to send friend request with error: \\(error!.localizedDescription).\")\n}" |
| 26 | }, |
| 27 | { |
| 28 | "timestamp": "11:47", |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 37 | "timestamp": "12:44", |
| 38 | "title": "Matter application controlling an LED light", |
| 39 | "language": "swift", |
| 40 | "code": "let led = LED()\n\n@_cdecl(\"app_main\")\nfunc app_main() {\n print(\"๐๏ธ Hello, Embedded Swift!\")\n \n // (1) create a Matter root node\n let rootNode = Matter.Node()\n rootNode.identifyHandler = {\n print(\"identify\")\n }\n \n // (2) create a \"light\" endpoint, configure it\n let lightEndpoint = Matter.ExtendedColorLight(node: rootNode)\n lightEndpoint. |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 25 | "timestamp": "9:26", |
| 26 | "title": "Creating the async message stream dispatcher", |
| 27 | "language": "swift", |
| 28 | "code": "// Create an async message stream dispatcher task\n\nTask {\n do {\n for try await output in session.outputs {\n switch output {\n case .requestProgress(let request, let fraction):\n print(\"Request progress: \\(fraction)\")\n case .requestComplete(let request, let result):\n if case .modelFile(let u |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 38 | "timestamp": "9:26", |
| 39 | "title": "Handle events", |
| 40 | "language": "swift", |
| 41 | "code": "// Handle event\nfunc handleSessionEvent(event: ASAccessoryEvent) { \n switch event.eventType {\n\n case .accessoryAdded:\n let newDice: ASAccessory = event.accessory!\n\n case .accessoryChanged:\n print(\"Accessory properties changed\")\n\n case .accessoryRemoved:\n print(\"Accessory removed from system\")\n\n default:\n print(\"Received event with type: \\( |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 37 | "timestamp": "6:00", |
| 38 | "title": "Add devices to input & add inputs to the capture session & enable Cinematic Video capture", |
| 39 | "language": "swift", |
| 40 | "code": "// Add devices to inputs\n\nlet videoInput = try! AVCaptureDeviceInput(device: camera)\nguard captureSession.canAddInput(videoInput) else {\n print(\"Can't add the video input to the session\")\n return\n}\n\nlet audioInput = try! AVCaptureDeviceInput(device: microphone)\nguard captureSession.canAddInput(audioInput) else |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 38 | "timestamp": "7:08", |
| 39 | "title": "handleBAR", |
| 40 | "language": "swift", |
| 41 | "code": "class ExtensionDelegate: NSObject, WKExtensionDelegate {\n func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {\n\n for task in backgroundTasks {\n\n switch task {\n case let backgroundTask as WKApplicationRefreshBackgroundTask:\n\n if let userInfo:NSDictionary = backgroundTask.userInfo as? NSDictionary {\n if let then:Date = userInfo[\ |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 44 | "timestamp": "10:22", |
| 45 | "title": "Communicate with accessory", |
| 46 | "language": "swift", |
| 47 | "code": "// Connect to accessory using CoreBluetooth\nlet central = CBCentralManager(delegate: self, queue: nil)\n\nfunc centralManagerDidUpdateState(_ central: CBCentralManager) {\n switch central.state {\n case .poweredOn:\n // state will only be updated to poweredOn when you have paired accessories\n let peripheral = central.retrievePeripherals(withIdentifiers: [newDice.bluet |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 133 | "timestamp": "25:32", |
| 134 | "title": "Shared Worker", |
| 135 | "language": "swift", |
| 136 | "code": "// Create Shared Worker\nlet worker = new SharedWorker(\"SharedWorker.js\");\n\n// Listen for messages from Shared Worker\nworker.port.addEventListener(\"message\", function(event) {\n console.log(\"Message received from worker: \" + event);\n});\n\n// Send messages to Shared Worker\nworker.port.postMessage(\"Send message to worker\");" |
| 137 | }, |
| 138 | { |
| 139 | "timestamp": "25:56", |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 20 | "timestamp": "8:03", |
| 21 | "title": "Request an age range", |
| 22 | "language": "swift", |
| 23 | "code": "// Request an age range\n\nimport SwiftUI\nimport DeclaredAgeRange\n\nstruct LandmarkDetail: View {\n // ...\n @State var photoSharingEnabled = false\n @Environment(\\.requestAgeRange) var requestAgeRange\n \n var body: some View {\n ScrollView {\n // ...\n Button(\"Share Photos\") {}\n .disabled(!photoSharingEnabled)\n }\n |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 73 | "timestamp": "12:14", |
| 74 | "title": "Fetching objects with #Predicate and FetchDescriptor", |
| 75 | "language": "swift", |
| 76 | "code": "let context = self.newSwiftContext(from: Trip.self)\nlet hotelNames = [\"First\", \"Second\", \"Third\"]\n\nvar predicate = #Predicate<Trip> { trip in\n trip.livingAccommodations.filter {\n hotelNames.contains($0.placeName)\n }.count > 0\n}\n\nvar descriptor = FetchDescriptor(predicate: predicate)\nvar trips = try context.fetch(descriptor)" |
| 77 | }, |
| 78 | |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 109 | "timestamp": "12:31", |
| 110 | "title": "Tailor SwiftData Fetch in Custom Migration Stage", |
| 111 | "language": "swift", |
| 112 | "code": "static let migrateV1toV2 = MigrationStage.custom(\n fromVersion: SampleTripsSchemaV1.self,\n toVersion: SampleTripsSchemaV2.self,\n willMigrate: { context in\n var fetchDesc = FetchDescriptor<SampleTripsSchemaV1.Trip>()\n fetchDesc.propertiesToFetch = [\\.name]\n\n let trips = try? context.fetch(fetchDesc)\n \n // De-duplicate Trip instanc |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 73 | "timestamp": "14:49", |
| 74 | "title": "Efficient verifyPosts implementation", |
| 75 | "language": "swift", |
| 76 | "code": "func verifyPosts(in context: NSManagedObjectContext) throws {\n try context.performAndWait {\n let fetchRequest = Attachment.fetchRequest()\n fetchRequest.resultType = .managedObjectIDResultType\n let attachments = try context.fetch(fetchRequest) as! [NSManagedObjectID]\n\n for index in 0...attachments.count - 1 {\n let attachment = cont |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 25 | "timestamp": "7:56", |
| 26 | "title": "Request the weather via REST API", |
| 27 | "language": "swift", |
| 28 | "code": "/* Request a token */\nconst tokenResponse = await fetch('https://example.com/token');\nconst token = await tokenResponse.text();\n\n/* Get my weather object */\nconst url = \"https://weatherkit.apple.com/1/weather/en-US/41.029/-74.642?dataSets=weatherAlerts&country=US\"\n\nconst weatherResponse = await fetch(url, {\nheaders: {\n\"Authorization\": token\n}\n});\nconst weather = await |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 25 | "timestamp": "6:12", |
| 26 | "title": "REST API: wait for completion", |
| 27 | "language": "swift", |
| 28 | "code": "# Wait for completion\n\ndef watch_upload(submission_id, token):\n while True:\n resp = requests.get(\n \"https://appstoreconnect.apple.com/notary/v2/submissions/\" + submission_id, \n headers={\"Authorization\": \"Bearer \" + token})\n\n output = resp.json()\n current_status = output[\"data\"][\"attributes\"][\"status\"]\n \n |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 61 | "timestamp": "8:41", |
| 62 | "title": "SampleTrips Custom Migration Stage from Version 1.0 to 2.0", |
| 63 | "language": "swift", |
| 64 | "code": "static let migrateV1toV2 = MigrationStage.custom(\n fromVersion: SampleTripsSchemaV1.self,\n toVersion: SampleTripsSchemaV2.self,\n willMigrate: { context in\n let fetchDesc = FetchDescriptor<SampleTripsSchemaV1.Trip>()\n let trips = try? context.fetch(fetchDesc)\n \n // De-duplicate Trip instances here...\n\n try? context.save()\ |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 55 | "timestamp": "7:49", |
| 56 | "title": "Implementing a SchemaMigrationPlan", |
| 57 | "language": "swift", |
| 58 | "code": "enum SampleTripsMigrationPlan: SchemaMigrationPlan {\n static var schemas: [any VersionedSchema.Type] {\n [SampleTripsSchemaV1.self, SampleTripsSchemaV2.self, SampleTripsSchemaV3.self]\n }\n \n static var stages: [MigrationStage] {\n [migrateV1toV2, migrateV2toV3]\n }\n\n static let migrateV1toV2 = MigrationStage.custom(\n fromVersion: SampleT |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 220 | // Extract current User-Agent from pre-generated headers |
| 221 | currentUserAgent = (options.headers as any)?.['User-Agent'] || null; |
| 222 | |
| 223 | const response = await fetch(url, options); |
| 224 | |
| 225 | const responseTime = Date.now() - startTime; |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 73 | "timestamp": "9:33", |
| 74 | "title": "SampleTrips Custom Migration Stage from Version 2.0 to 3.0", |
| 75 | "language": "swift", |
| 76 | "code": "static let migrateV2toV3 = MigrationStage.custom(\n fromVersion: SampleTripsSchemaV2.self,\n toVersion: SampleTripsSchemaV3.self,\n willMigrate: { context in\n let trips = try? context.fetch(FetchDescriptor<SampleTripsSchemaV2.Trip>())\n\n // De-duplicate Trip instances here...\n\n try? context.save()\n }, \n didMigrate: nil\n)" |
| 77 | }, |
| 78 | { |
| 79 | |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 55 | "timestamp": "5:32", |
| 56 | "title": "Fetching with a FetchDescriptor", |
| 57 | "language": "swift", |
| 58 | "code": "let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate)\n\nlet trips = try context.fetch(descriptor)" |
| 59 | }, |
| 60 | { |
| 61 | "timestamp": "5:46", |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 19 | "timestamp": "4:53", |
| 20 | "title": "REST API: upload file for notarization", |
| 21 | "language": "swift", |
| 22 | "code": "# Upload file for notarization\n\ndef upload_file(token, filepath, sha256):\n data = { \"sha256\": sha256, \"submissionName\": os.path.basename(filepath) }\n resp = requests.post(\n \"https://appstoreconnect.apple.com/notary/v2/submissions\",\n json=data,\n headers={\"Authorization\": \"Bearer \" + token})\n\n output = resp.json()\n aws_info = ou |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 25 | "timestamp": "5:07", |
| 26 | "title": "Testing a large data generator", |
| 27 | "language": "swift", |
| 28 | "code": "class TestLargeDataGenerator: CoreDataCloudKitDemoUnitTestCase {\n func testGenerateData() throws {\n let context = self.coreDataStack.persistentContainer.newBackgroundContext()\n try self.generator.generateData(context: context)\n try context.performAndWait { \n let posts = try context.fetch(Post.fetchRequest())\n for p |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 115 | "timestamp": "13:11", |
| 116 | "title": "Add relationshipsToPrefetch in Custom Migration Stage", |
| 117 | "language": "swift", |
| 118 | "code": "static let migrateV1toV2 = MigrationStage.custom(\n fromVersion: SampleTripsSchemaV1.self,\n toVersion: SampleTripsSchemaV2.self,\n willMigrate: { context in\n var fetchDesc = FetchDescriptor<SampleTripsSchemaV1.Trip>()\n fetchDesc.propertiesToFetch = [\\.name]\n fetchDesc.relationshipKeyPathsForPrefetching = [\\.livingAccommodation]\n\n |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 67 | "timestamp": "14:14", |
| 68 | "title": "Problematic verifyPosts implementation", |
| 69 | "language": "swift", |
| 70 | "code": "func verifyPosts(in context: NSManagedObjectContext) throws {\n try context.performAndWait {\n let fetchRequest = Post.fetchRequest()\n let posts = try context.fetch(fetchRequest)\n\n for post in posts {\n // verify post\n\n let attachments = post.attachments as! Set<Attachment>\n for attachment in attachments {\n\n |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 11 | "hasTranscript": true, |
| 12 | "hasCode": false, |
| 13 | "transcript": { |
| 14 | "fullText": "โช โช Razvan: Hello! I'm Razvan, an engineer on the WebKit Developer Experience team, and I'm here to tell you about some of the new features and improvements we've made to Web Inspector this year. Web Inspector is part of Safari on macOS, and it provides a powerful set of tools that allow you to inspect all the resources and activities of a website, web app, web extension, or home screen web app. I'm excited to show you |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 31 | "timestamp": "6:11", |
| 32 | "title": "Fetching a composite attribute", |
| 33 | "language": "swift", |
| 34 | "code": "private func findAircraft(with color: String) {\n viewContext.performAndWait {\n let fetchRequest = Aircraft.fetchRequest()\n fetchRequest.predicate = NSPredicate(format: \"colorScheme.primary == %@\", color)\n \n do {\n var fetchedResults: [Aircraft]\n fetchedResults = try viewContext.fetch(fetchRequest)\n \n / |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 49 | "timestamp": "16:54", |
| 50 | "title": "willMigrationHandler and didMigrationHandler of NSCustomMigrationStage", |
| 51 | "language": "swift", |
| 52 | "code": "customStage.willMigrateHandler = { migrationManager, currentStage in\n guard let container = migrationManager.container else {\n return\n }\n\n let context = container.newBackgroundContext()\n try context.performAndWait {\n let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: \"Aircraft\")\n fetchR |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 61 | "timestamp": "5:46", |
| 62 | "title": "Fetching with fetch and sort descriptors", |
| 63 | "language": "swift", |
| 64 | "code": "let descriptor = FetchDescriptor<Trip>(\n sortBy: SortDescriptor(\\Trip.name),\n predicate: tripPredicate\n)\n\nlet trips = try context.fetch(descriptor)" |
| 65 | }, |
| 66 | { |
| 67 | "timestamp": "6:15", |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 31 | "timestamp": "7:34", |
| 32 | "title": "Process history changes", |
| 33 | "language": "swift", |
| 34 | "code": "private func findTrips(in transactions: [DefaultHistoryTransaction]) -> (Set<Trip>, DefaultHistoryToken?) {\n let taskContext = ModelContext(modelContainer)\n var resultTrips: Set<Trip> = []\n for transaction in transactions {\n for change in transaction.changes {\n let modelID = change.changedPersistentIdentifier\n let fetchDescri |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 67 | "timestamp": "11:54", |
| 68 | "title": "Fetching objects with FetchDescriptor", |
| 69 | "language": "swift", |
| 70 | "code": "let context = self.newSwiftContext(from: Trip.self)\nvar trips = try context.fetch(FetchDescriptor<Trip>())" |
| 71 | }, |
| 72 | { |
| 73 | "timestamp": "12:14", |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 79 | "timestamp": "12:27", |
| 80 | "title": "Fetching objects with #Predicate and FetchDescriptor", |
| 81 | "language": "swift", |
| 82 | "code": "let context = self.newSwiftContext(from: Trip.self)\n\npredicate = #Predicate<Trip> { trip in\n trip.livingAccommodations.filter {\n $0.hasReservation == false\n }.count > 0\n}\n\ndescriptor = FetchDescriptor(predicate: predicate)\nvar trips = try context.fetch(descriptor)" |
| 83 | }, |
| 84 | { |
| 85 | "timestamp": "13:18", |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 121 | "timestamp": "13:28", |
| 122 | "title": "Update Widget to harness fetchLimit", |
| 123 | "language": "swift", |
| 124 | "code": "// Widget code to get new Timeline Entry\n\nfunc getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {\n let currentDate = Date.now\n var fetchDesc = FetchDescriptor(sortBy: [SortDescriptor(\\Trip.startDate, order: .forward)])\n fetchDesc.predicate = #Predicate { $0.endDate >= currentDate }\n\n fetchDesc.fetchLimit = 1\n \n let modelContext = M |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
MCP tool input schema exposes an unconstrained string/any field with a risky name (command/query/sql/code/script/url/path/expr/ eval). Any caller can pass arbitrary values, which typically widens the tool's blast radius well beyond its intent. Narrow the schema with `.enum()`, `.regex()`, `.max()`, `Literal[...]`, Pydantic `Field(max_length=..., pattern=...)`, or a JSON Schema `enum` / `pattern` / `maxLength`.
Evidence
| 18 | * Schema for search_wwdc_content |
| 19 | */ |
| 20 | export const searchWWDCContentSchema = z.object({ |
| 21 | query: z.string().min(1).describe('Search query'), |
| 22 | searchIn: z.enum(['transcript', 'code', 'both']).default('both').describe('Where to search'), |
| 23 | year: z.string().optional().describe('Filter by WWDC year'), |
| 24 | language: z.string().optional().describe('Filter code by language'), |
Remediation
Shape the schema to the tool's actual intent: - Zod: chain `.enum([...])`, `.regex(/.../)`, or `.max(n)`; prefer `z.enum([...])` or `z.literal(...)` when the value set is small. - Pydantic: use `Literal["a", "b"]` or `Field(max_length=..., pattern=r"...")`. - JSON Schema: add `"enum"`, `"pattern"`, or `"maxLength"` to the property. An overbroad schema is an "overpowered tool" โ the model has nothing to prevent it from calling the tool with input far beyond what the tool's prose contract
MCP tool input schema exposes an unconstrained string/any field with a risky name (command/query/sql/code/script/url/path/expr/ eval). Any caller can pass arbitrary values, which typically widens the tool's blast radius well beyond its intent. Narrow the schema with `.enum()`, `.regex()`, `.max()`, `Literal[...]`, Pydantic `Field(max_length=..., pattern=...)`, or a JSON Schema `enum` / `pattern` / `maxLength`.
Evidence
| 1 | import { z } from 'zod'; |
| 2 | |
| 3 | export const searchAppleDocsSchema = z.object({ |
| 4 | query: z.string().describe('Search query for Apple Developer Documentation'), |
| 5 | type: z.enum(['all', 'documentation', 'sample']).default('all') |
| 6 | .describe('Type of content to search for (documentation=API reference, sample=code samples)'), |
| 7 | }); |
Remediation
Shape the schema to the tool's actual intent: - Zod: chain `.enum([...])`, `.regex(/.../)`, or `.max(n)`; prefer `z.enum([...])` or `z.literal(...)` when the value set is small. - Pydantic: use `Literal["a", "b"]` or `Field(max_length=..., pattern=r"...")`. - JSON Schema: add `"enum"`, `"pattern"`, or `"maxLength"` to the property. An overbroad schema is an "overpowered tool" โ the model has nothing to prevent it from calling the tool with input far beyond what the tool's prose contract
MCP tool input schema exposes an unconstrained string/any field with a risky name (command/query/sql/code/script/url/path/expr/ eval). Any caller can pass arbitrary values, which typically widens the tool's blast radius well beyond its intent. Narrow the schema with `.enum()`, `.regex()`, `.max()`, `Literal[...]`, Pydantic `Field(max_length=..., pattern=...)`, or a JSON Schema `enum` / `pattern` / `maxLength`.
Evidence
| 1 | import { z } from 'zod'; |
| 2 | |
| 3 | export const getAppleDocContentSchema = z.object({ |
| 4 | url: z.string().describe('URL of the Apple Developer Documentation page'), |
| 5 | includeRelatedApis: z.boolean().default(false).describe('Include related APIs analysis'), |
| 6 | includeReferences: z.boolean().default(false).describe('Include references resolution'), |
| 7 | includeSimilarApis: z.boolean().default(false).describe('Include similar APIs discovery'), |
Remediation
Shape the schema to the tool's actual intent: - Zod: chain `.enum([...])`, `.regex(/.../)`, or `.max(n)`; prefer `z.enum([...])` or `z.literal(...)` when the value set is small. - Pydantic: use `Literal["a", "b"]` or `Field(max_length=..., pattern=r"...")`. - JSON Schema: add `"enum"`, `"pattern"`, or `"maxLength"` to the property. An overbroad schema is an "overpowered tool" โ the model has nothing to prevent it from calling the tool with input far beyond what the tool's prose contract
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 40 | - name: Upload coverage reports |
| 41 | if: matrix.node-version == '20.x' |
| 42 | uses: codecov/codecov-action@v4 |
| 43 | with: |
| 44 | files: ./coverage/lcov.info |
| 45 | flags: unittests |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 11 | steps: |
| 12 | - name: Checkout code |
| 13 | uses: actions/checkout@v4 |
| 14 | with: |
| 15 | fetch-depth: 0 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 19 | uses: actions/checkout@v4 |
| 20 | |
| 21 | - name: Install pnpm |
| 22 | uses: pnpm/action-setup@v3 |
| 23 | with: |
| 24 | version: 9 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 26 | actions: read # Required for Claude to read CI results on PRs |
| 27 | steps: |
| 28 | - name: Checkout repository |
| 29 | uses: actions/checkout@v4 |
| 30 | with: |
| 31 | fetch-depth: 1 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 24 | version: 9 |
| 25 | |
| 26 | - name: Setup Node.js |
| 27 | uses: actions/setup-node@v4 |
| 28 | with: |
| 29 | node-version: 20.x |
| 30 | cache: 'pnpm' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 58 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |
| 59 | |
| 60 | - name: Create GitHub Release |
| 61 | uses: softprops/action-gh-release@v1 |
| 62 | with: |
| 63 | generate_release_notes: true |
| 64 | body: | |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 94 | steps: |
| 95 | - name: Checkout code |
| 96 | uses: actions/checkout@v4 |
| 97 | |
| 98 | - name: Install pnpm |
| 99 | uses: pnpm/action-setup@v3 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 27 | steps: |
| 28 | - name: Checkout repository |
| 29 | uses: actions/checkout@v4 |
| 30 | with: |
| 31 | fetch-depth: 1 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 54 | steps: |
| 55 | - name: Checkout code |
| 56 | uses: actions/checkout@v4 |
| 57 | |
| 58 | - name: Install pnpm |
| 59 | uses: pnpm/action-setup@v3 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 16 | steps: |
| 17 | - name: Checkout code |
| 18 | uses: actions/checkout@v4 |
| 19 | |
| 20 | - name: Install pnpm |
| 21 | uses: pnpm/action-setup@v3 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 33 | - name: Run Claude Code Review |
| 34 | id: claude-review |
| 35 | uses: anthropics/claude-code-action@v1 |
| 36 | with: |
| 37 | claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} |
| 38 | prompt: | |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 24 | version: 9 |
| 25 | |
| 26 | - name: Setup Node.js ${{ matrix.node-version }} |
| 27 | uses: actions/setup-node@v4 |
| 28 | with: |
| 29 | node-version: ${{ matrix.node-version }} |
| 30 | cache: 'pnpm' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 87 | - name: Comment PR status |
| 88 | if: always() |
| 89 | uses: actions/github-script@v7 |
| 90 | with: |
| 91 | script: | |
| 92 | const { context } = require('@actions/github'); |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 97 | uses: actions/checkout@v4 |
| 98 | |
| 99 | - name: Install pnpm |
| 100 | uses: pnpm/action-setup@v3 |
| 101 | with: |
| 102 | version: 9 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 62 | version: 9 |
| 63 | |
| 64 | - name: Setup Node.js |
| 65 | uses: actions/setup-node@v4 |
| 66 | with: |
| 67 | node-version: 20.x |
| 68 | cache: 'pnpm' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 57 | uses: actions/checkout@v4 |
| 58 | |
| 59 | - name: Install pnpm |
| 60 | uses: pnpm/action-setup@v3 |
| 61 | with: |
| 62 | version: 9 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 16 | steps: |
| 17 | - name: Checkout code |
| 18 | uses: actions/checkout@v4 |
| 19 | |
| 20 | - name: Install pnpm |
| 21 | uses: pnpm/action-setup@v3 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 32 | - name: Run Claude Code |
| 33 | id: claude |
| 34 | uses: anthropics/claude-code-action@v1 |
| 35 | with: |
| 36 | claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 102 | version: 9 |
| 103 | |
| 104 | - name: Setup Node.js |
| 105 | uses: actions/setup-node@v4 |
| 106 | with: |
| 107 | node-version: 20.x |
| 108 | cache: 'pnpm' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 119 | steps: |
| 120 | - name: Checkout code |
| 121 | uses: actions/checkout@v4 |
| 122 | |
| 123 | - name: Run security audit |
| 124 | run: pnpm audit --audit-level=high || true |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 21 | version: 9 |
| 22 | |
| 23 | - name: Setup Node.js |
| 24 | uses: actions/setup-node@v4 |
| 25 | with: |
| 26 | node-version: 20.x |
| 27 | cache: 'pnpm' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 19 | uses: actions/checkout@v4 |
| 20 | |
| 21 | - name: Install pnpm |
| 22 | uses: pnpm/action-setup@v3 |
| 23 | with: |
| 24 | version: 9 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable โ a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 16 | fetch-depth: 0 |
| 17 | |
| 18 | - name: Install pnpm |
| 19 | uses: pnpm/action-setup@v3 |
| 20 | with: |
| 21 | version: 9 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version โ Dependabot can do this automatically with `version-update-strategy: inc
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 79 | "timestamp": "31:02", |
| 80 | "title": "Terrain material transition using the slider", |
| 81 | "language": "swift", |
| 82 | "code": "@State private var sliderValue: Float = 0.0\n\nSlider(value: $sliderValue, in: (0.0)...(1.0))\n .onChange(of: sliderValue) { _, _ in\n guard let terrain = rootEntity.findEntity(named: \"DioramaTerrain\"),\n var modelComponent = terrain.components[ModelComponent.self],\n var shaderGraphMaterial = modelComponent.materials.first \n |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 61 | "timestamp": "20:47", |
| 62 | "title": "Relevant Intents Function", |
| 63 | "language": "swift", |
| 64 | "code": "func updateBackyardRelevantIntents() async {\n let modelContext = ModelContext(DataGeneration.container)\n var relevantIntents = [RelevantIntent]()\n \n for backyard in Backyard.allBackyards(modelContext: modelContext) {\n\n let configIntent = ConfigurationAppIntent()\n configIntent.backyardID = backyard.id.uuidString\n let relevantFoodDateContext = Relevan |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.