6 ms·
Mac app launches slowed by malware scan (2024)
Follow-up: https://lapcatsoftware.com/articles/2025/5/1.html https://lapcatsoftware.com/articles/2025/5/1.html
- lapcat 1y agoAuthor here. It's unclear why HN is interested in this post, because it's just a response to another blogger's recent posts, which weren't even submitted to HN. Visitors aren't going to have the background context. My original post "Mac app launches slowed by malware scan" was submitted to HN last year, though it received 0 comments at the time. https://lapcatsoftware.com/articles/2024/2/3.html https://lapcatsoftware.com/articles/2024/2/3.html
- username223 1y agoSubmitter here. I submitted it because it explains a bug I recently encountered. Other people apparently found it useful. Should I delete it?
- lapcat 1y ago> Should I delete it? Is that even possible? Anyway, I just think my 2024 post is a better place to start, because it explains the issue directly, whereas this new post simply refutes another blogger and argues that there's nothing new beyond my 2024 post. That interpersonal drama/conflict probably isn't going to be understandable or useful to readers.
- tough 1y ago@dang or mods can replace a main discussion link if they think its apt/good for the final user you might write to the email on the footer of this page to reach them
- dang 1y agoOk, we've switched to that from https://lapcatsoftware.com/articles/2025/5/1.html https://lapcatsoftware.com/articles/2025/5/1.html above, and I'll add a link to the follow-up to the top text.
- carlosjobim 1y agoEVERYBODY: You can fix the Affinity slow start-up problem on MacOS in a simple step: Go to your App folder and duplicate the "Affinity Photo 2" app. Then remove the original and use the duplicate. Now Affinity starts in 2 seconds instead of in 30 seconds on my M3 machine.
- dijit 1y agoWhy does this work?
- carlosjobim 1y agoI have no idea. I found it deeply buried in a support forum the other day.
- saagarjha 1y agoI think I checked this once and it was doing Rosetta translation
- pier25 1y agoI just updated to the latest version and Affinity Photo 2 opens in seconds now.
- spiffotron 1y agoI'd legitimately love to know why this has worked wtf
- mmastrac 1y agoI bet you could get the same results by duplicating the inner binary only rather than the whole folder. I saw something very similar with terminal apps. The blog post doesn't mention this app - am I missing something?
- carlosjobim 1y agoThe follow up blog post published today mentions Affinity. It's also one of the worst apps to start slowly on macos.
- larrywright 1y agoI wonder if this is why Fusion 360 is so slow to start. It's by far the slowest app on my relatively modern M1 MacBook Pro.
- Avamander 1y agoIt's slow on almost everything, so I kinda doubt macOS is to blame.
- longtimelistnr 1y agoNever saw a CAD app boot fast... Shapr3D is the best but something as advanced as Fusion or Solidworks has always been slow to open
- fortran77 1y ago[flagged]
- m3047 1y agoTIL: MacOS ships with YARA.
- john-h-k 1y agoI’ve got a personal project compiler I built and it’s hit by this very hard. Testing involves (naturally) generating lots of executables. Running it in a Linux docker container takes around ~1s for all 500 tests. macOS by default takes around a _minute_, and even with the workarounds I’ve found (“allow untrusted software to be run by iterm2”) it takes 5-8 seconds. It’s a pretty niche use case but it’s deeply frustrating
- krackers 1y ago> Macs have a cache of SHA-256 hashes of all bundled files of all apps that have been launched. But where exactly is this cache I always assumed this had to be the case? When you first launch an application gatekeeper takes a long time verifying it, but on subsequent launches it's fast. So _some_ bit seems to be stored somewhere indicating whether or not this is "first launch" and whether full verification needs to be performed (maybe it's the launch services cache?) As for whether the entire image is verified before _each_ launch, I'm not 100% familiar with the flow but I don't think that's correct, it can be done lazily on a page by page basis. https://developer.apple.com/documentation/endpointsecurity/es_process_t https://developer.apple.com/documentation/endpointsecurity/e... >In the specific case of process execution, this is after the exec completes in the kernel, but before any code in the process starts executing. At that point, XNU has validated the signature itself and has verified that the cdhash is correct. This second validation means that the hash of all individual page hashes in the Code Directory match the signed cdhash, essentially verifying the signature wasn’t tampered with. However, XNU doesn’t verify individual page hashes until the binary executes and pages in the corresponding pages. XNU doesn’t determine a binary shows signs of tampering until the individual pages page in, at which point XNU updates the code signing flags. If you can replicate this on an Intel mac where code signature is optional, you could try more rigorous comparisons comparing an unsigned binary vs a signed one. In both cases I'd assume yara signature checks would apply.
- lapcat 1y ago> So _some_ bit seems to be stored somewhere indicating whether or not this is "first launch" Yes, of course. How do you go from that to "a cache of SHA-256 hashes of all bundled files of all apps that have been launched"?
- krackers 1y agoIsn't there some cache of code-signing info? https://wiki.lazarus.freepascal.org/Code_Signing_for_macOS https://wiki.lazarus.freepascal.org/Code_Signing_for_macOS >Specifically, the code signing information (code directory hash) is hung off the vnode within the kernel, and modifying the file behind that cache will cause problems. You need a new vnode, which means a new file, that is, a new inode. Documented in WWDC 2019 Session 703 All About Notarization - see slide 65 (PDF). This seems to be described in https://eclecticlight.co/2024/04/29/apfs-beyond-to-vfs-and-volfs/ https://eclecticlight.co/2024/04/29/apfs-beyond-to-vfs-and-v... but I'm just a layman here. I don't quite understand the benefits of this caching if you have to recompute them to detect mismatch anyway. [1] And I realize now the initial gatekeeper scan is probably just controlled by presence of quarantine bit, the result themselves are probably not cached. Edit: Now I'm not so sure, spctl has a --ignore-cache option. So the result of gatekeeper is indeed cached somehow. And presumably as you noted it's a cache miss for this which causes the long application launch delay. [1] https://github.com/golang/go/issues/42684 https://github.com/golang/go/issues/42684 has a bit more info on this, I'm happy to see that even seasoned experts are confused about these things.
- davb 1y agoRelated, I found that even after designating an application (iTerm2) as a "Developer Tool" in System Settings -> Privacy & Security, there were circumstances where notarisation checks were still carried out. Particularly, launching tmux then detaching and reattaching would cause the processes to no longer be exempt. This applies to any executable (+x), including shell scripts. I put together a test script that proves it at https://gist.github.com/davebarkerxyz/4111276ae1fb4a7566b271bd7afed607 https://gist.github.com/davebarkerxyz/4111276ae1fb4a7566b271... (the second run is much quicker than the first one after a tmux reattach, but within applications marked as Developer Tools the times should be nearly identical). Fortunately as of Sequoia (15.4.1), I'm no longer able to reproduce the issue.
- eviks 1y ago> doubt that the built-in system libraries are scanned for malware, because they reside on a separate cryptographically-signed read-only disk volume. Would be nice to be able to do the same for user apps and only scan on volume updates (when app update) instead of the current constant waste of time and energy
- musicale 1y agosyspolicyd rears its ugly head again.