As of now, there is no Kernel Debug Kit (KDK) available for macOS 26.0 Developer Betas after the first build. Kernel Debug Kits are crucial for understanding panics and other bugs within custom Kernel Extensions. Without the KDK for the corresponding macOS version, tools like kmutil fail to recognize a KDK and certain functions are disabled. Additionally, as far as I am aware, a KDK for one build of macOS isn't able to be used on a differing build. Especially since this is a developer beta, where developers are updating their software to function with the latest versions of macOS, I'd expect a KDK to be available for more than one build.
Core OS
RSS for tagExplore the core architecture of the operating system, including the kernel, memory management, and process scheduling.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello, appreciate any help here.
Objective: perform a scoped write to a removable block device (using low-level system frameworks in C).
Issue: launchd-run privileged helper (as root) denied permission to open block device. Manual 'sudo ./helper' call succeeds, however.
Importantly: the entire process works flawlessly if the main app is granted Full Disk Access in Privacy & Security. However, this should be completely unnecessary for this objective, as scoped access should be sufficient, and FDA is in fact not required for other apps which perform this task.
Architecture and flow:
Main GUI process collects ISO path and target removable device path (queried via IOKit).
Main GUI process installs a Privileged Helper via SMJobBless.
The Privileged Helper is started on demand by launchd as root (UID 0, EUID 0).
Main GUI process communicates selected ISO and device paths to Privileged Helper via XPC.
Privileged Helper conducts security and sanity checks, unmounts volumes from target device via DiskArbitration.
Privileged Helper obtains file handles to ISO and target block device (e.g.: "/dev/disk4").
Privileged Helper performs a byte-by-byte write to the target block device.
Problematic area:
Simplified example using C syscalls (via Zig):
const path = "/dev/disk5";
// Note that even with readonly flag this fails
const fd = c.open(path, c.O_RDONLY, @as(c_uint, 0));
defer _ = c.close(fd);
if (fd < 0) {
const err_num = c.__error().*;
const err_str = c.strerror(err_num);
log("open() failed with errno {}: {s}", .{ err_num, err_str });
}
Output (when run by launchd - UID 0, EUID 0, domain: system):
open() failed with errno 1: Operation not permitted
Simplified example with Zig open interface:
const directory = try std.fs.openDirAbsolute(deviceDir, .{ .no_follow = true });
const device = try directory.openFile("/dev/disk5", .{ .mode = .read_write, .lock = .exclusive });
errdefer device.close();
Output (when run by launchd - UID 0, EUID 0, domain: system):
Error: error.AccessDenied
Running the same examples by manually launching the binary with a test argument succeeds:
sudo ./helper "/dev/disk5"
...
Notable points:
Both Main GUI process and the Privileged Helper binary are codesigned (via codesign ...).
Privileged Helper has both Info.plist and Launchd.plist symbols exported into its binary.
Privileged Helper has no codesign flags (e.g.: for hardened runtime or others): CodeDirectory v=20400 size=8130 flags=0x0(none) hashes=248+2 location=embedded
Output of sudo launchctl print system/<helper-bundle-id> shows nothing of interest to indicate any security restrictions.
Appreciate any advice here!
Topic:
App & System Services
SubTopic:
Core OS
Tags:
Background Tasks
Disk Arbitration
Files and Storage
I am facing an issue while codesigning the Content/MacOS executable. The executable name is exactly similar to the .app file, and the signing certificates have not expired yet.
Steps followed to generate signed files:
Executed codesign on files within the .app folder.
Then executed codesign on the .app folder.
Tried to notarize with the new notarization tool.
Do we have to sign each individual file and folder?
Observations:
.DS_Store files were removed from the .app before signing.
Another app with the same certificate is able to sign correctly.
Content/MacOS contains multiple files, including the app executable. These files are signed except the main executable.
same installed_app after copying at another location showing signed.
Getting:
App Sandbox-Not enabled
Hardening-Enabled - Version 10.9.0
Notarization-Granted
Gatekeeper-Can't evaluate
Signed By- Can't verify signature
With the RC version of macOS 26, an issue persists when you try to create a bookmark with security scope for the root folder "/". This leads to an error "The file couldn’t be opened.". However, you can create bookmark for /Applications, /System, /Users...
This is quite annoying for one of my app because a user can create a cartography of his disk usage, and the access to the root folder "/" is the only way to do so!
Is there a workaround?
PS: reported the issue with ID FB20186406
let openPanel = NSOpenPanel()
openPanel.canChooseDirectories = true
openPanel.canChooseFiles = false
openPanel.beginSheetModal(for: self.view.window!) { (result) in
guard result == .OK, let folderURL = openPanel.url else {
return
}
openPanel.close()
do {
let data = try folderURL.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil)
print("Bookmark data was created for \(folderURL.path)")
} catch (let error) {
print("Error creating bookmark for \(folderURL.path), with error: \(error.localizedDescription)")
}
}
I am able to symbolicate kernel backtraces for addresses that belong to my kext.
Is it possible to symbolicate kernel backtraces for addresses that lie beyond my kext and reference kernel code?
Sample kernel panic log
I have a project that need to get serial number and network SSID. I have looking anywhere to get those 2 value but no luck to find it. is there anyway i can get those information from the device?
Recently, I've noticed that background Bluetooth scanning stops when I move an app to the background on an iPhone 17 device with Bluetooth 6. I'm curious about a solution. Background Bluetooth scanning doesn't stop on devices older than iOS 26, or on devices that were updated from an iPhone 17 or earlier to iOS 26.
PLATFORM AND VERSION
Model - iPhone 13 Pro Max (Potentially for other models also)
OS - iOS 26
DESCRIPTION OF PROBLEM :
BLE discoverability (advertising) is not working on iOS 26 but works reliably on older iOS versions.
Details: Our app acts as a Bluetooth peripheral. When advertising, the app only adds CBAdvertisementDataLocalNameKey in advertisement data.
Format of local name - "NTDI:103202400001"
We have observed that in iOS 26, the local name is getting truncated. This breaks the parsing logic in our IOT device central code, which expects the full local name to be present. We have also observed that some extra data is getting added to the advertisement data by the OS.
As of now, updating the IOT device logic for parsing is not possible.
STEPS TO REPRODUCE
Create an instance of CBPeripheralManager.
Start advertising with a local name with the format "NTDI:103202400001"
Capture the advertisement data using a Bluetooth sniffer tool.
Observe that the local name is getting truncated
Legacy ADV_IND as received by IoT device (truncated name):
HCI Event: LE Meta Event (0x3e) plen 27
LE Advertising Report (0x02)
Event type: ADV_IND (0x00)
Data length: 15
Flags: 0x1a
TX power: 12 dBm
12 09 4e 54 44 49 3a 31 30 ..NTDI:10
RSSI: -47 dBm
Only partial Local Name (“NTDI:10…”) is present in this primary PDU.
Is it possible to avoid the extra data introduced by iOS or avoid local name truncation?
I'm debugging the following kernel panic to do with my custom filesystem KEXT:
panic(cpu 0 caller 0xfffffe004cae3e24): [kalloc.type.var4.128]: element modified after free (off:96, val:0x00000000ffffffff, sz:128, ptr:0xfffffe2e7c639600)
My reading of this is that somewhere in my KEXT I'm holding a reference 0xfffffe2e7c639600 to a 128 byte zone that wrote 0x00000000ffffffff at offset 96 after that particular chunk of memory had been released and zeroed out by the kernel.
The panic itself is emitted when my KEXT requests the memory chunk that's been tempered with via the following set of calls.
zalloc_uaf_panic()
__abortlike
static void
zalloc_uaf_panic(zone_t z, uintptr_t elem, size_t size)
{
...
(panic)("[%s%s]: element modified after free "
"(off:%d, val:0x%016lx, sz:%d, ptr:%p)%s",
zone_heap_name(z), zone_name(z),
first_offs, first_bits, esize, (void *)elem, buf);
...
}
zalloc_validate_element()
static void
zalloc_validate_element(
zone_t zone,
vm_offset_t elem,
vm_size_t size,
zalloc_flags_t flags)
{
...
if (memcmp_zero_ptr_aligned((void *)elem, size)) {
zalloc_uaf_panic(zone, elem, size);
}
...
}
The panic is triggered if memcmp_zero_ptr_aligned(), which is implemented in assembly, detects that an n-sized chunk of memory has been written after being free'd.
/* memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros.
* Address and size of the string s must be pointer-aligned.
* Return 0 if true, 1 otherwise. Also return 0 if n is 0.
*/
extern int
memcmp_zero_ptr_aligned(const void *s, size_t n);
Normally, KASAN would be resorted to to aid with that.
The KDK README states that KASAN kernels won't load on Apple Silicon.
Attempting to follow the instructions given in the README for Intel-based machines does result in a failure for me on Apple Silicon.
I stumbled on the Pishi project.
But the custom boot kernel collection that gets created doesn't have any of the KEXTs that were specified to kmutil(8) via the --explicit-only flag, so it can't be instrumented in Ghidra.
Which is confirmed as well by running:
% kmutil inspect -B boot.kc.kasan
boot kernel collection at /Users/user/boot.kc.kasan
(AEB8F757-E770-8195-458D-B87CADCAB062):
Extension Information:
I'd appreciate any pointers on how to tackle UAFs in kernel space.
For years, my app has been receiving XLSX files from other apps using the share command.
For example, in an email, I use the share command on an xlsx attachment and send it to my app.
From my app, I go to the Documents/Inbox folder and find the file.
This mechanism has broken! And I'm not talking about an app compiled with XCode26, but simply installing my app, still compiled with XCode16, on iPadOS26.
It seems that the operating system no longer puts files in the Inbox. Is this true?
Our app scans Bluetooth in the background.
However, the iPhone 17 device does not scan in the background.
ios 26
Is there anything I need to do?
Hey
In my opinion osLog ( or Logging ) is an Apple Logging framework which provides logging facilities.
And swift-log is Swift OpenSource framework which provides logging facitilies.
And on Apple platforms Apple frameworks ( osLog ) are more conveinent and performant than Swift OpenSource frameworks.
Am I right?
So, a difference between these two frameworks is that swift-log provides an open source logging analogue for Swift.
Our app scans Bluetooth in the background.
However, the iPhone 17 device does not scan in the background.
ios 26
Is there anything I need to do?
The setting values are as follows.
device
connection interval min : 60
connection interval max : 75
slave latency : 0
supervision timeout : 4000
advertising interval : 20
Our app scans Bluetooth in the background.
However, the iPhone 17 device does not scan in the background.
ios 26
Is there anything I need to do?
device1
connection interval min : 60
connection interval max : 75
slave latency : 0
supervision timeout : 4000
advertising interval : 20
I have successfully booted the Linux Kernel with VirtIOFS as the rootfs, but file permission issues render it completely unusable. A file on the macOS host belongs to uid 0, gid 0, but on the Linux guest, this file belongs to uid 1000, gid 10. Why does this happen? How are file permissions directly mapped between the host and the guest? If there is no mapping mechanism in place, why does this discrepancy occur? This leads to errors in Linux, such as:
sudo: /etc/sudo.conf is owned by uid 1000, should be 0
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
bootLoader.commandLine = "console=hvc0 rootfstype=virtiofs root=myfs rw"
let directorySharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: "myfs")
directorySharingDevice.share = VZSingleDirectoryShare(directory: VZSharedDirectory(url: rootURL!, readOnly: false))
The VMM is running as root.
Hi!
I was wondering if there will be new XNU version for macOS 26 published open source? As far as I remember, previous version's source code was published the moment the OS was officially released, but not this time. If yes, when we can expect it to be published?
I'm just getting started w/ container. I've been using lima. I thought that container should be investigated.
I installed the .4.1 package, and started the tutorial.
Imagine my surprise when the local dns entry could be created, but not set as a property.
The command
container system --help
doesn't show property as a valid subcommand?
OVERVIEW: Manage system components
USAGE: container system <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
dns Manage local DNS domains
logs Fetch system logs for `container` services
start Start `container` services
stop Stop all `container` services
status Show the status of `container` services
kernel Manage the default kernel configuration
See 'container help system <subcommand>' for detailed help.
> ~ container system property
Error: Unexpected argument 'property'
Usage: container system <subcommand>
See 'container system --help' for more information.
Some logs
container system status
apiserver is not running and not registered with launchd
> ~ container system start
Verifying apiserver is running...
Installing base container filesystem...
> ~ container system status
Verifying apiserver is running...
apiserver is running
> ~ container system property
Error: Unexpected argument 'property'
Usage: container system <subcommand>
See 'container system --help' for more information.
I'm obviously missing something. Advice appreciated
It's quite common for app bundles to be distributed in .zip files, and to be stored on-disk as filesystem-compressed files. However, having them both appears to be an edge case that's broken for at least two major releases! (FB19048357, FB19329524)
I'd expect a simple ditto -x -k appbundle.zip ~/Applications (-x: extract, -k: work on a zip file) to work. Instead it spits out countless errors and leaves 0 Byte files in the aftermath 😭
Please fix.
How do I get the FileManager in SwiftUI to read information about the apps in the Applications folder. Lots of apps do it, Alfred, Raycast. It's not something that is unheard of, and yet I cannot for the life of me, using every kind of guide on the internet figure out how to achieve this. Please somebody help, this is legitimately affecting my mental health.
Hello! Some colleagues and work on Jujutsu, a version control system compatible with git, and I think we've uncovered a potential lock contention bug in either APFS or the Darwin kernel. There are four contributing factors to us thinking this is related to APFS or the Kernel:
jj's testsuite uses nextest, a test runner for Rust that spawns each individual test as a separate process.
The testsuite slowed down by a factor of ~5x on macOS after jj started using fsync. The slowdown increases as additional cores are allocated.
A similar slowdown did not occur on ext4.
Similar performance issues were reported in the past by a former Mercurial maintainer: https://gregoryszorc.com/blog/2018/10/29/global-kernel-locks-in-apfs/.
My friend and colleague André has measured the test suite on an M3 Ultra with both a ramdisk and a traditional SSD and produced this graph:
(The most thorough writeup is the discussion on this pull request.)
I know I should file a feedback/bug report, but before I do, I'm struggling with profiling and finding kernel/APFS frames in my profiles so that I can properly attribute the cause of this apparent lock contention. Naively, I ran xctrace record --template 'Time Profiler' --output output.trace --launch /Users/dbarsky/.cargo/bin/cargo-nextest nextest run, and while that detected all processes spawned by nextest, it didn't record all processes as part of the same inspectable profile and didn't really show any frames from the kernel/APFS—I had to select individual processes. So I don't waste people's time and so that I can point a frame/smoking gun in the right system, how can I can use instruments to profile where the kernel and/or APFS are spending its time? Do I need to disable SIP?