v2.0 — 31 C POC twins + harness fixes

- 31 C POC files, one per CVE folder: full seed construction + trigger +
  main(), self-contained, no app dependency. All compile clean with
  clang -O2 -Wall (zero warnings) on macOS arm64; each has a recorded
  oracle on this host.
- CMGetDMVersionLevelFromRPU ABI pinned by disassembly: macOS export is
  (CFDataRef), the Swift POC drives the 4-arg iOS surface — this is the
  mechanism behind the cm.rpu death oracle on the simulator build.
- Harness fixes: glyphCount guard, MachOInspector size guard, ModTools
  clamp, DeviceModel iPhone19,7, GPTPayload clamps, Gate patch display.
- POC comments rewritten English-only (31 swift + arc.rr + 5 py).
- README (en/zh): C twin column, .c anatomy section, compile/run
  examples, C oracle verification status.
- Dead if-let binding removed from Identity summary; v2.0 build 3.
This commit is contained in:
JBJF committed 2026-10-29 20:08:55 +08:00
1 parent 1ea76ab005
commit 7949c7ce9f
79 files changed
+4109 -892

No files matched your search

+31 -21
View File
@@ -8,8 +8,14 @@ import SwiftUI
enum VersionGate {
enum Result {
case supported(major: Int, minor: Int, build: String)
case unsupported(major: Int, minor: Int, build: String)
case supported(major: Int, minor: Int, patch: Int, build: String)
case unsupported(major: Int, minor: Int, patch: Int, build: String)
}
/// "27.0" for a zero patch, "27.0.1" when there is one. The patch is part of the
/// answer — a 27.0.1 device that reports "27.0" is a false reading.
static func versionString(major: Int, minor: Int, patch: Int) -> String {
patch != 0 ? "\(major).\(minor).\(patch)" : "\(major).\(minor)"
}
static func evaluate() -> Result {
@@ -33,12 +39,12 @@ enum VersionGate {
supported = false // 27.2+ / 28+ — patched
}
// An explicit override exists for research builds where the version string lies.
if ProcessInfo.processInfo.environment["CINDER27_FORCE_GATE"] == "1" {
return .supported(major: v.majorVersion, minor: v.minorVersion, build: build)
if ProcessInfo.processInfo.environment["CINDER27_FORCE_GATE"] == "1" {
return .supported(major: v.majorVersion, minor: v.minorVersion, patch: v.patchVersion, build: build)
}
return supported
? .supported(major: v.majorVersion, minor: v.minorVersion, build: build)
: .unsupported(major: v.majorVersion, minor: v.minorVersion, build: build)
? .supported(major: v.majorVersion, minor: v.minorVersion, patch: v.patchVersion, build: build)
: .unsupported(major: v.majorVersion, minor: v.minorVersion, patch: v.patchVersion, build: build)
}
static var isSupported: Bool {
@@ -53,17 +59,17 @@ struct GateView: View {
enum Phase {
case checking
case supported(major: Int, minor: Int, build: String)
case unsupported(major: Int, minor: Int, build: String)
case supported(major: Int, minor: Int, patch: Int, build: String)
case unsupported(major: Int, minor: Int, patch: Int, build: String)
}
var body: some View {
ZStack {
T.bg.ignoresSafeArea()
if entered, case let .supported(major, minor, build) = phase {
if entered, case let .supported(major, minor, patch, build) = phase {
RootView()
.environment(\.gateInfo, GateInfo(major: major, minor: minor, build: build))
.environment(\.gateInfo, GateInfo(major: major, minor: minor, patch: patch, build: build))
.transition(.opacity)
} else {
content
@@ -106,7 +112,7 @@ struct GateView: View {
}
.padding(.top, 20)
case let .supported(major, minor, build):
case let .supported(major, minor, patch, build):
Card {
VStack(alignment: .leading, spacing: 10) {
HStack(spacing: 8) {
@@ -117,7 +123,7 @@ struct GateView: View {
.font(.system(size: 15, weight: .semibold, design: .rounded))
.foregroundColor(T.good)
}
KeyValueRow(key: t("gate.detected"), value: "iOS \(major).\(minor)")
KeyValueRow(key: t("gate.detected"), value: VersionGate.versionString(major: major, minor: minor, patch: patch))
KeyValueRow(key: t("gate.build"), value: build)
KeyValueRow(key: t("gate.required"), value: "17.0 – 27.1")
}
@@ -129,7 +135,7 @@ struct GateView: View {
}
.padding(.horizontal, 24)
case let .unsupported(major, minor, build):
case let .unsupported(major, minor, patch, build):
Card {
VStack(alignment: .leading, spacing: 10) {
HStack(spacing: 8) {
@@ -140,7 +146,7 @@ struct GateView: View {
.font(.system(size: 15, weight: .semibold, design: .rounded))
.foregroundColor(T.bad)
}
KeyValueRow(key: t("gate.detected"), value: "iOS \(major).\(minor)", tint: T.bad)
KeyValueRow(key: t("gate.detected"), value: VersionGate.versionString(major: major, minor: minor, patch: patch), tint: T.bad)
KeyValueRow(key: t("gate.build"), value: build)
KeyValueRow(key: t("gate.required"), value: "17.0 – 27.1")
Divider().overlay(T.stroke)
@@ -170,8 +176,8 @@ struct GateView: View {
private var phaseText: String {
switch phase {
case .checking: return "checking"
case let .supported(m, n, _): return "ok-\(m).\(n)"
case let .unsupported(m, n, _): return "no-\(m).\(n)"
case let .supported(m, n, p, _): return "ok-\(m).\(n).\(p)"
case let .unsupported(m, n, p, _): return "no-\(m).\(n).\(p)"
}
}
@@ -179,10 +185,10 @@ struct GateView: View {
phase = .checking
DispatchQueue.main.asyncAfter(deadline: .now() + 0.45) {
switch VersionGate.evaluate() {
case let .supported(major, minor, build):
phase = .supported(major: major, minor: minor, build: build)
case let .unsupported(major, minor, build):
phase = .unsupported(major: major, minor: minor, build: build)
case let .supported(major, minor, patch, build):
phase = .supported(major: major, minor: minor, patch: patch, build: build)
case let .unsupported(major, minor, patch, build):
phase = .unsupported(major: major, minor: minor, patch: patch, build: build)
}
}
}
@@ -191,11 +197,15 @@ struct GateView: View {
struct GateInfo {
let major: Int
let minor: Int
let patch: Int
let build: String
/// The full detected version, patch included — what the gate actually read.
var osVersion: String { VersionGate.versionString(major: major, minor: minor, patch: patch) }
}
private struct GateInfoKey: EnvironmentKey {
static let defaultValue = GateInfo(major: 0, minor: 0, build: "—")
static let defaultValue = GateInfo(major: 0, minor: 0, patch: 0, build: "—")
}
extension EnvironmentValues {