{"id":"CVE-2026-114611","kind":"vulnerability","aliases":["CVE-2026-114611"],"related":[],"title":"OCO-Server: unauthenticated forged MDM enrollment steals device identity certificates","description":"OCO-Server is a self-hosted endpoint management application for computer inventory, software deployment, and mobile device management. Prior to 1.2.3,the Apple MDM enrollment endpoint `frontend/api-mdm.php` verifies the signed enrollment-request plist with `openssl_pkcs7_verify(..., PKCS7_NOVERIFY, ...)`. `PKCS7_NOVERIFY` disables signer certificate chain and trust validation, so the signature only has to be self-consistent with whatever certificate is embedded in the PKCS#7 blob. A self-signed certificate from an unrelated attacker is accepted. Because the endpoint trusts the `SERIAL` field taken from the unverified payload, anyone who knows a registered device's serial number can sign a forged plist (`SERIAL` = victim device, attacker-chosen `UDID`) with an arbitrary self-signed certificate; POST it unauthenticated to `/api-mdm.php/profile` (Content-Type: `application/pkcs7-signature`); and receive the victim device's freshly minted MDM identity: a certificate with `CN=<serial>` issued by the server's internal MDM device CA, bundled with its private key in a PKCS#12 payload inside the returned `.mobileconfig` enrollment profile. Additionally, the victim's `mobile_device` database row is silently overwritten with the attacker-supplied `UDID` (device-record hijack). With the stolen certificate and key, the attacker can impersonate the victim device on all subsequent MDM traffic (`/checkin`, `/mdm`, `/parameters`), which authenticate callers by the certificate CN (the serial number) via `checkSignature()` in the same file. This yields control over the victim device's MDM relationship: reading its management data, replacing its push token, and disrupting or redirecting its enrollment. Version 1.2.3 fixes the issue.","summary":"OCO-Server, a self-hosted endpoint and Apple MDM management app, accepts enrollment plists signed with any self-made certificate because signer trust is never checked. An attacker who knows a registered device's serial number gets that device's MDM identity certificate and private key, can impersonate it, and can overwrite its database record with their own UDID.","severity":"critical","cvss":9.1,"epss":0.00229,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apple","mdm","oco-server","other","package","self-hosted"],"not_affected_if":["version-1.2.3-or-later"],"how_to_check":"Check the installed OCO-Server version; versions before 1.2.3 are affected.","fix":"Upgrade OCO-Server to version 1.2.3 or later.","status":"open","published_at":"2026-10-22T18:17:28+00:00","first_seen_at":"2026-10-23T21:57:31+00:00","triaged_at":"2026-10-23T22:32:18+00:00","updated_at":"2026-10-24T07:15:51+00:00","category":"other","confidence":0.85,"triage":{"at":"2026-10-23T22:32:18Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade OCO-Server to version 1.2.3 or later.","reach":"internet","title":"OCO-Server: unauthenticated forged MDM enrollment steals device identity certificates","impact":"high","summary":"OCO-Server, a self-hosted endpoint and Apple MDM management app, accepts enrollment plists signed with any self-made certificate because signer trust is never checked. An attacker who knows a registered device's serial number gets that device's MDM identity certificate and private key, can impersonate it, and can overwrite its database record with their own UDID.","category":"other","who_cares":["oco-server","apple","mdm","self-hosted"],"confidence":0.85,"needs_auth":"no","worst_case":"Attacker impersonates enrolled devices and takes over their MDM management.","analyst_note":"","how_to_check":"Check the installed OCO-Server version; versions before 1.2.3 are affected.","needs_analyst":false,"not_affected_if":["version-1.2.3-or-later"],"user_interaction":"no","needs_special_setup":"unknown","severity_if_unknown":"critical"},"cost_usd":0.00099,"input_tokens":3466,"output_tokens":1286,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-114611':14A,17A '-2026':13A,16A '/api-mdm.php/profile':216C '/checkin':299C '/mdm':300C '/parameters':301C '1.2.3':112C,343C '12':252C '7':159C 'accept':41B,171C 'addit':260C 'anyon':184C 'app':40B 'appl':18B,37B,114C 'applic':100C 'application/pkcs7-signature':220C 'arbitrari':207C 'attack':58B,169C,202C,274C,288C 'attacker-chosen':201C 'attacker-suppli':273C 'authent':303C 'blob':160C 'bundl':244C 'ca':243C 'caller':304C 'certif':11A,50B,73B,136C,153C,165C,211C,232C,284C,307C 'chain':137C 'check':56B 'checksignatur':313C 'chosen':203C 'cn':234C,308C 'comput':102C 'consist':150C 'content':218C 'content-typ':217C 'control':320C 'cve':12A,15A 'data':331C 'databas':84B,266C 'deploy':105C 'devic':9A,63B,69B,108C,189C,200C,225C,242C,265C,278C,293C,324C 'device-record':277C 'disabl':134C 'disrupt':337C 'embed':155C 'endpoint':35B,98C,117C,174C 'enrol':7A,42B,116C,123C,258C,341C 'enrollment-request':122C 'field':178C 'file':317C 'fix':344C 'forg':5A,196C 'fresh':227C 'frontend/api-mdm.php':118C 'get':67B 'hijack':280C 'host':27B,34B,97C 'ident':10A,72B,230C 'imperson':78B,290C 'insid':254C 'intern':240C 'inventori':103C 'issu':235C,346C 'key':76B,248C,286C 'know':60B,186C 'made':49B 'manag':39B,99C,109C,330C 'mdm':6A,19B,38B,71B,115C,229C,241C,297C,326C 'mint':228C 'mobil':107C,264C 'mobileconfig':257C 'never':55B 'noverifi':131C,133C 'number':66B,192C,311C 'oco':2A,21B,29B,91C 'oco-serv':1A,20B,28B,90C 'openssl':127C 'overwrit':82B 'overwritten':270C 'packag':24B 'payload':183C,253C 'pkcs':158C,251C 'pkcs7':128C,130C,132C 'plist':43B,125C,197C 'post':212C 'prior':110C 'privat':75B,247C 'profil':259C 'push':334C 'read':328C 'receiv':222C 'record':85B,279C 'redirect':339C 'regist':62B,188C 'relationship':327C 'replac':332C 'request':124C 'return':256C 'row':267C 'self':26B,33B,48B,96C,149C,163C,209C 'self-consist':148C 'self-host':25B,32B,95C 'self-mad':47B 'self-sign':162C,208C 'serial':65B,177C,191C,198C,310C 'server':3A,22B,30B,92C,238C 'sign':44B,121C,164C,194C,210C 'signatur':143C 'signer':52B,135C 'silent':269C 'softwar':104C 'steal':8A 'stolen':283C 'subsequ':296C 'suppli':275C 'taken':179C 'token':335C 'traffic':298C 'trust':53B,139C,175C 'type':219C 'udid':89B,204C,276C 'unauthent':4A,214C 'unrel':168C 'unverifi':182C 'valid':140C 'verifi':119C,129C 'version':342C 'via':312C 'victim':199C,224C,262C,292C,323C 'whatev':152C 'yield':319C","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-22T18:17:28+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-114611","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-114611","severity":null,"published_at":"2026-10-22T18:17:28+00:00","modified_at":"2026-10-23T19:57:42+00:00","first_seen_at":"2026-10-23T21:57:31+00:00","fetched_at":"2026-10-23T22:29:02+00:00","note":null},{"source":"epss","external_id":"CVE-2026-114611","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-114611","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-24T07:15:51+00:00","fetched_at":"2026-10-25T12:38:51+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}