<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ios on DBG.RE</title><link>https://dbg.re/tags/ios/</link><description>Recent content in Ios on DBG.RE</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 09 Nov 2026 19:30:00 +0000</lastBuildDate><atom:link href="https://dbg.re/tags/ios/index.xml" rel="self" type="application/rss+xml"/><item><title>CVE-2026-65339: A Microphone Permission Bypass on iOS</title><link>https://dbg.re/posts/cve-2026-65339-audiomxd-microphone-permission-bypass/</link><pubDate>Mon, 09 Nov 2026 19:30:00 +0000</pubDate><guid>https://dbg.re/posts/cve-2026-65339-audiomxd-microphone-permission-bypass/</guid><description>&lt;p&gt;A sandboxed iOS app with no added entitlements shows the microphone prompt. The user taps &lt;strong&gt;Don't Allow&lt;/strong&gt;. The app records anyway, while its permission still reads &lt;code&gt;denied&lt;/code&gt; and no orange indicator appears. Once started, the capture survives backgrounding and a locked device.&lt;/p&gt;
&lt;figure class="pocui inset large" data-step="3"&gt;
 &lt;div class="pocui-controls" role="group" aria-label="Sequence playback"&gt;
 &lt;button type="button" data-pocui="toggle" aria-label="Pause"&gt;
 &lt;svg class="pocui-ico" viewBox="0 0 24 24" aria-hidden="true" focusable="false"&gt;
 &lt;g class="ico ico-play"&gt;&lt;path d="M8 5 L19 12 L8 19 Z"/&gt;&lt;/g&gt;
 &lt;g class="ico ico-pause"&gt;&lt;rect x="7" y="5" width="3.6" height="14" rx="1.2"/&gt;&lt;rect x="13.4" y="5" width="3.6" height="14" rx="1.2"/&gt;&lt;/g&gt;
 &lt;g class="ico ico-replay"&gt;
 &lt;path d="M12 5.6 a6.4 6.4 0 1 1 -6.3 7.5" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/&gt;
 &lt;path d="M9.2 2.2 L14.6 5.6 L9.2 9 Z"/&gt;
 &lt;/g&gt;
 &lt;/svg&gt;
 &lt;/button&gt;
 &lt;span class="pocui-steps"&gt;
 &lt;button type="button" data-goto="1" aria-pressed="false"&gt;launch&lt;/button&gt;
 &lt;button type="button" data-goto="2" aria-pressed="false"&gt;prompt&lt;/button&gt;
 &lt;button type="button" data-goto="3" aria-pressed="true"&gt;capturing&lt;/button&gt;
 &lt;/span&gt;
 &lt;span class="pocui-hint"&gt;or step through it yourself&lt;/span&gt;
 &lt;/div&gt;
&lt;svg viewBox="0 0 902 700" role="img" class="pocui-svg" aria-label="Illustration of the proof of concept. The app launches, the user denies the microphone prompt, and capture proceeds anyway while no orange microphone indicator appears"&gt;
&lt;style&gt;
 .pocui-controls{display:none;gap:.8rem;align-items:center;margin-bottom:.8rem}
 .pocui[data-js="1"] .pocui-controls{display:flex;flex-wrap:wrap}
 .pocui-controls button{font-family:inherit;font-size:1.4rem;line-height:1.2;padding:.4rem .9rem;
 border:1px solid currentColor;border-radius:3px;background:transparent;color:inherit;cursor:pointer}
 .pocui-steps{display:flex;gap:.35rem;flex-wrap:wrap}
 .pocui-hint{font-size:1.25rem;opacity:.5;align-self:center}
 .pocui-controls button[aria-pressed="true"]{font-weight:700;opacity:1}
 .pocui-controls button{opacity:.55}
 .pocui-controls button:disabled{opacity:.25;cursor:default}
 .pocui-controls button[data-pocui="toggle"]{display:inline-flex;align-items:center;justify-content:center;
 width:3.2rem;height:3.2rem;padding:0;opacity:.8}
 .pocui-ico{width:1.9rem;height:1.9rem;fill:currentColor}
 .pocui .ico{display:none}
 .pocui[data-mode="play"] .ico-play{display:inline}
 .pocui[data-mode="playing"] .ico-pause{display:inline}
 .pocui[data-mode="replay"] .ico-replay{display:inline}
 .pocui-svg text{font-family:ui-sans-serif,-apple-system,"SF Pro Text",Helvetica,Arial,sans-serif;fill:#1c1c1e}
 .pocui-svg .mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
 .pocui-svg .g2{fill:#8e8e93}
 .pocui-svg [data-act]{cursor:pointer}
 .pocui-svg .hit{fill:#000;fill-opacity:0}
 .pocui-svg [data-act]:hover .hit{fill-opacity:.07}
 .pocui-svg [data-act]:focus-visible{outline:none}
 .pocui-svg [data-act]:focus-visible .hit{fill-opacity:.1;stroke:#007aff;stroke-width:2}
 .pocui-svg .ann{font-size:14.5px;fill:#4c5057}
 .pocui-svg .brand{font-size:12.5px;font-weight:600;letter-spacing:.04em;fill:#8e8e93}
 .pocui-svg .annb{font-size:15.5px;font-weight:700;fill:#26282c}
 .pocui-svg .lead{stroke:#9aa0a6;stroke-width:1.2;fill:none;stroke-dasharray:4 3}
 .pocui-svg .bezel{fill:none;stroke:#c7c7cc;stroke-width:1.5}
 .pocui-svg .card{fill:#78788c;fill-opacity:.12}
 .pocui-svg .island{fill:#000}
 .pocui-svg .red{fill:#ff3b30}
 .pocui-svg .amber{fill:#ff9f0a}
 .pocui-svg .ok{fill:#34c759}
 .pocui-svg .tint{fill:#007aff}
 .pocui-svg .redcap{fill:#ff3b30;fill-opacity:.13;stroke:#ff3b30;stroke-opacity:.34;stroke-width:1.5}
 .pocui-svg .ambcap{fill:#ff9f0a;fill-opacity:.13;stroke:#ff9f0a;stroke-opacity:.34;stroke-width:1.5}
 .pocui-svg .bg0{stop-color:#fff}
 .pocui-svg .bg1{stop-color:#5856d6;stop-opacity:.10}
 .pocui-svg .bg2{stop-color:#32ade6;stop-opacity:.10}
 .pocui-svg .elev{fill:#e9e9ee}
 .pocui-svg .sheet{fill:#f7f7f8}
 .pocui-svg .hair{stroke:#c7c7cc;stroke-width:1}
 .pocui-svg .dim{fill:#000;fill-opacity:.22}
 
 .pocui-svg .s12,.pocui-svg .s2,.pocui-svg .s3{opacity:0;pointer-events:none;transition:opacity .09s linear}
 [data-step="1"] .pocui-svg .s12,[data-step="2"] .pocui-svg .s12{opacity:1;pointer-events:auto}
 [data-step="2"] .pocui-svg .s2{opacity:1;pointer-events:auto}
 [data-step="3"] .pocui-svg .s3{opacity:1;pointer-events:auto}
 .pocui-svg .annblk{transition:opacity .3s ease}
 .pocui[data-js="1"] .pocui-svg .annblk{opacity:.22}
 .pocui[data-js="1"] .pocui-svg .annblk.on{opacity:1}
 .pocui[data-js="1"] .pocui-svg .annblk:not(.on) .lead{opacity:0}
 .pocui-svg [data-ann="2"] .lead{opacity:0}
 [data-step="2"] .pocui-svg [data-ann="2"] .lead{opacity:1;pointer-events:auto}
 .pocui-svg .wave{transform-box:fill-box;transform-origin:center}
 [data-step="3"] .pocui-svg .wave{animation:pocui-bar 1100ms ease-in-out infinite alternate}
 .pocui-svg .dot{transform-box:fill-box;transform-origin:center}
 [data-step="3"] .pocui-svg .dot{animation:pocui-dot 720ms ease-in-out infinite alternate}
 [data-step="2"] .pocui-svg .tap{animation:pocui-tap 900ms ease-out infinite}
 .pocui-svg .noind-ring{fill:none;stroke:#9aa0a6;stroke-width:1.3;stroke-dasharray:2.5 2.5}
 .pocui-svg .noind-halo{fill:none;stroke:#9aa0a6;stroke-width:1.2;opacity:0;transform-box:fill-box;transform-origin:center}
 .pocui-svg .noind-dot{fill:none;stroke:#ff9f0a;stroke-width:1.4;opacity:.6}
 .pocui-svg .noind-slash{stroke:#ff9f0a;stroke-width:1.5;stroke-linecap:round;stroke-dasharray:12;stroke-dashoffset:0}
 [data-step="3"] .pocui-svg .noind-halo{animation:pocui-halo 3s ease-out infinite}
 [data-step="3"] .pocui-svg .noind-dot{animation:pocui-ghost 3s ease-in-out infinite}
 [data-step="3"] .pocui-svg .noind-slash{animation:pocui-strike 3s ease-in-out infinite}
 @keyframes pocui-bar{from{transform:scaleY(.30)}to{transform:scaleY(1)}}
 @keyframes pocui-dot{from{transform:scale(1);opacity:1}to{transform:scale(1.45);opacity:.45}}
 @keyframes pocui-tap{0%{transform:scale(.35);opacity:.65}70%{transform:scale(1);opacity:0}100%{opacity:0}}
 @keyframes pocui-halo{0%{transform:scale(1);opacity:.7}35%,100%{transform:scale(1.8);opacity:0}}
 @keyframes pocui-ghost{0%,8%{opacity:0}28%,82%{opacity:.6}100%{opacity:0}}
 @keyframes pocui-strike{0%,30%{stroke-dashoffset:12;opacity:1}48%,82%{stroke-dashoffset:0;opacity:1}100%{stroke-dashoffset:0;opacity:0}}
 @media (prefers-reduced-motion:reduce){
 .pocui-svg .wave,.pocui-svg .dot,.pocui-svg .tap,.pocui-svg .noind-halo,.pocui-svg .noind-dot,.pocui-svg .noind-slash{animation:none!important}
 .pocui-svg .s12,.pocui-svg .s2,.pocui-svg .s3,.pocui-svg .annblk{transition:none}
 }
 
body.colorscheme-dark .pocui-svg text{fill:#f2f2f7}
body.colorscheme-dark .pocui-svg .hit{fill:#fff}
body.colorscheme-dark .pocui-svg .ann{fill:#c7cbd1}
body.colorscheme-dark .pocui-svg .brand{fill:#7e838a}
body.colorscheme-dark .pocui-svg .annb{fill:#f2f2f7}
body.colorscheme-dark .pocui-svg .bezel{stroke:#5f5f66}
body.colorscheme-dark .pocui-svg .elev{fill:#17171a}
body.colorscheme-dark .pocui-svg .bg0{stop-color:#000}
body.colorscheme-dark .pocui-svg .bg1{stop-opacity:.045}
body.colorscheme-dark .pocui-svg .bg2{stop-opacity:.035}
body.colorscheme-dark .pocui-svg .card{fill:#2c2c2e;fill-opacity:.92}
body.colorscheme-dark .pocui-svg .island{fill:#1c1c1e}
body.colorscheme-dark .pocui-svg .red{fill:#ff453a}
body.colorscheme-dark .pocui-svg .ok{fill:#30d158}
body.colorscheme-dark .pocui-svg .amber{fill:#ffd60a}
body.colorscheme-dark .pocui-svg .tint{fill:#0a84ff}
body.colorscheme-dark .pocui-svg .sheet{fill:#3a3a3c}
body.colorscheme-dark .pocui-svg .hair{stroke:#545458}
body.colorscheme-dark .pocui-svg .dim{fill-opacity:.45}
body.colorscheme-dark .pocui-svg .redcap{fill:#ff453a;fill-opacity:.20;stroke:#ff453a;stroke-opacity:.45}
body.colorscheme-dark .pocui-svg .ambcap{fill:#ffd60a;fill-opacity:.16;stroke:#ffd60a;stroke-opacity:.4}
@media (prefers-color-scheme:dark){
body.colorscheme-auto .pocui-svg text{fill:#f2f2f7}
body.colorscheme-auto .pocui-svg .hit{fill:#fff}
body.colorscheme-auto .pocui-svg .ann{fill:#c7cbd1}
body.colorscheme-auto .pocui-svg .brand{fill:#7e838a}
body.colorscheme-auto .pocui-svg .annb{fill:#f2f2f7}
body.colorscheme-auto .pocui-svg .bezel{stroke:#5f5f66}
body.colorscheme-auto .pocui-svg .elev{fill:#17171a}
body.colorscheme-auto .pocui-svg .bg0{stop-color:#000}
body.colorscheme-auto .pocui-svg .bg1{stop-opacity:.045}
body.colorscheme-auto .pocui-svg .bg2{stop-opacity:.035}
body.colorscheme-auto .pocui-svg .card{fill:#2c2c2e;fill-opacity:.92}
body.colorscheme-auto .pocui-svg .island{fill:#1c1c1e}
body.colorscheme-auto .pocui-svg .red{fill:#ff453a}
body.colorscheme-auto .pocui-svg .ok{fill:#30d158}
body.colorscheme-auto .pocui-svg .amber{fill:#ffd60a}
body.colorscheme-auto .pocui-svg .tint{fill:#0a84ff}
body.colorscheme-auto .pocui-svg .sheet{fill:#3a3a3c}
body.colorscheme-auto .pocui-svg .hair{stroke:#545458}
body.colorscheme-auto .pocui-svg .dim{fill-opacity:.45}
body.colorscheme-auto .pocui-svg .redcap{fill:#ff453a;fill-opacity:.20;stroke:#ff453a;stroke-opacity:.45}
body.colorscheme-auto .pocui-svg .ambcap{fill:#ffd60a;fill-opacity:.16;stroke:#ffd60a;stroke-opacity:.4}
}
&lt;/style&gt;
&lt;defs&gt;
&lt;marker id="pu-a" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"&gt;
 &lt;path d="M0,1 L7,4 L0,7" fill="none" stroke="#9aa0a6" stroke-width="1.3"/&gt;&lt;/marker&gt;
&lt;linearGradient id="pu-bg" x1="0" y1="0" x2="1" y2="1"&gt;
 &lt;stop class="bg0" offset="0"/&gt;&lt;stop class="bg1" offset=".55"/&gt;
 &lt;stop class="bg2" offset="1"/&gt;&lt;/linearGradient&gt;
&lt;linearGradient id="pu-icon" x1="0" y1="0" x2="0" y2="1"&gt;
 &lt;stop offset="0" stop-color="#5856d6"/&gt;&lt;stop offset="1" stop-color="#32ade6"/&gt;&lt;/linearGradient&gt;
&lt;linearGradient id="pu-wave" x1="0" y1="1" x2="0" y2="0"&gt;
 &lt;stop offset="0" stop-color="#ff2d55"/&gt;&lt;stop offset=".5" stop-color="#ff3b30"/&gt;
 &lt;stop offset="1" stop-color="#ff9500"/&gt;&lt;/linearGradient&gt;
&lt;clipPath id="pu-screen"&gt;&lt;rect x="19" y="21" width="402" height="874" rx="46"/&gt;&lt;/clipPath&gt;
&lt;/defs&gt;
&lt;rect class="elev" x="8" y="10" width="424" height="896" rx="57"/&gt;
&lt;rect x="19" y="21" width="402" height="874" rx="46" fill="url(#pu-bg)"/&gt;
&lt;g clip-path="url(#pu-screen)"&gt;
&lt;text data-clock="1" x="49" y="59" font-size="15" font-weight="600"&gt;13:15&lt;/text&gt;
&lt;text data-brand="1" class="brand" x="97" y="59"&gt;dbg.re&lt;/text&gt;
&lt;rect x="307.33" y="56.33" width="3.31" height="3.31" rx="1.07" fill="currentColor"/&gt;
&lt;rect x="312.66" y="56.33" width="3.31" height="3.31" rx="1.07" fill="currentColor"/&gt;
&lt;rect x="318.00" y="56.33" width="3.31" height="3.31" rx="1.07" fill="currentColor"/&gt;
&lt;rect x="323.33" y="56.33" width="3.31" height="3.31" rx="1.07" fill="currentColor" opacity=".21"/&gt;
&lt;g fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"&gt;
&lt;path d="M335.58 51.96 A 9.75 9.75 0 0 1 349.08 51.96"/&gt;
&lt;path d="M338.58 55.09 A 5.42 5.42 0 0 1 346.08 55.09"/&gt;
&lt;/g&gt;
&lt;path d="M340.13 56.4 L344.53 56.4 L342.33 59.0 Z" fill="currentColor" stroke="currentColor" stroke-width=".8" stroke-linejoin="round"/&gt;
&lt;rect x="358.83" y="47.5" width="24" height="11.67" rx="3.8" fill="none" stroke="currentColor" stroke-width="1" opacity=".38"/&gt;
&lt;rect x="360.33" y="49.0" width="21" height="8.67" rx="2.6" fill="currentColor"/&gt;
&lt;rect x="384.33" y="51.33" width="1.34" height="4.33" rx=".67" fill="currentColor" opacity=".5"/&gt;
&lt;rect class="island" x="157.0" y="32" width="126" height="37" rx="18.5"/&gt;
&lt;text x="220.0" y="113" text-anchor="middle" font-size="17" font-weight="600"&gt;RemoteIO Demo&lt;/text&gt;
&lt;rect x="192.0" y="154" width="56" height="56" rx="19" fill="url(#pu-icon)"/&gt;
&lt;rect x="203.0" y="176.0" width="3.4" height="12" rx="1.7" fill="#fff" fill-opacity=".95"/&gt;
&lt;rect x="210.0" y="172.0" width="3.4" height="20" rx="1.7" fill="#fff" fill-opacity=".95"/&gt;
&lt;rect x="217.0" y="168.0" width="3.4" height="28" rx="1.7" fill="#fff" fill-opacity=".95"/&gt;
&lt;rect x="224.0" y="172.0" width="3.4" height="20" rx="1.7" fill="#fff" fill-opacity=".95"/&gt;
&lt;rect x="231.0" y="176.0" width="3.4" height="12" rx="1.7" fill="#fff" fill-opacity=".95"/&gt;
&lt;text class="s12" x="220.0" y="237" text-anchor="middle" font-size="20" font-weight="700"&gt;Microphone enforcement probe&lt;/text&gt;
&lt;text class="s3" x="220.0" y="237" text-anchor="middle" font-size="20" font-weight="700"&gt;Recording without permission&lt;/text&gt;
&lt;text class="g2 s12" x="220.0" y="263" text-anchor="middle" font-size="13"&gt;Tap Record, then choose Don't Allow.&lt;/text&gt;
&lt;text class="g2 s3" x="220.0" y="263" text-anchor="middle" font-size="13"&gt;The user chose Don't Allow when prompted.&lt;/text&gt;
&lt;g class="s12"&gt;&lt;rect class="ambcap" x="66.5" y="272" width="307" height="34" rx="17"/&gt;&lt;circle class="amber" cx="86.5" cy="289" r="5.5"/&gt;&lt;text x="100.5" y="294" font-size="15" font-weight="600"&gt;Microphone permission: not asked&lt;/text&gt;&lt;/g&gt;
&lt;g class="s3"&gt;&lt;rect class="redcap" x="77.5" y="272" width="285" height="34" rx="17"/&gt;&lt;circle class="red" cx="97.5" cy="289" r="5.5"/&gt;&lt;text x="111.5" y="294" font-size="15" font-weight="600"&gt;Microphone permission: denied&lt;/text&gt;&lt;/g&gt;
&lt;rect class="card" x="37" y="317" width="366" height="160" rx="22"/&gt;
&lt;circle class="g2 s12" cx="59" cy="342" r="5.5" fill-opacity=".5"/&gt;
&lt;circle class="red dot s3" cx="59" cy="342" r="5.5"/&gt;
&lt;text class="s12" x="77" y="348" font-size="17" font-weight="600"&gt;Waiting to start&lt;/text&gt;
&lt;text class="s3" x="77" y="348" font-size="17" font-weight="600"&gt;Live microphone input&lt;/text&gt;
&lt;g class="s12"&gt;
&lt;circle class="tint" cx="55.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="67.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="79.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="91.9" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="104.1" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="116.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="128.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="140.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="152.9" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="165.1" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="177.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="189.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="201.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="213.9" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="226.1" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="238.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="250.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="262.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="274.9" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="287.1" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="299.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="311.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="323.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="335.9" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="348.1" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="360.3" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="372.5" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;circle class="tint" cx="384.7" cy="419" r="2.6" fill-opacity=".5"/&gt;
&lt;/g&gt;
&lt;g class="s3"&gt;
&lt;rect class="wave" x="51.8" y="401.9" width="7.0" height="34.2" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-0ms"/&gt;
&lt;rect class="wave" x="64.0" y="378.8" width="7.0" height="80.4" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-137ms"/&gt;
&lt;rect class="wave" x="76.2" y="390.1" width="7.0" height="57.9" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-274ms"/&gt;
&lt;rect class="wave" x="88.4" y="393.5" width="7.0" height="51.0" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-411ms"/&gt;
&lt;rect class="wave" x="100.6" y="401.5" width="7.0" height="34.9" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-548ms"/&gt;
&lt;rect class="wave" x="112.8" y="400.6" width="7.0" height="36.7" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-685ms"/&gt;
&lt;rect class="wave" x="125.0" y="384.2" width="7.0" height="69.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-822ms"/&gt;
&lt;rect class="wave" x="137.2" y="399.2" width="7.0" height="39.7" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-959ms"/&gt;
&lt;rect class="wave" x="149.4" y="379.5" width="7.0" height="79.0" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-1096ms"/&gt;
&lt;rect class="wave" x="161.6" y="384.0" width="7.0" height="70.1" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-133ms"/&gt;
&lt;rect class="wave" x="173.8" y="387.8" width="7.0" height="62.4" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-270ms"/&gt;
&lt;rect class="wave" x="186.0" y="394.0" width="7.0" height="50.1" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-407ms"/&gt;
&lt;rect class="wave" x="198.2" y="391.3" width="7.0" height="55.3" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-544ms"/&gt;
&lt;rect class="wave" x="210.4" y="393.8" width="7.0" height="50.5" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-681ms"/&gt;
&lt;rect class="wave" x="222.6" y="397.1" width="7.0" height="43.8" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-818ms"/&gt;
&lt;rect class="wave" x="234.8" y="386.5" width="7.0" height="65.0" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-955ms"/&gt;
&lt;rect class="wave" x="247.0" y="384.1" width="7.0" height="69.8" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-1092ms"/&gt;
&lt;rect class="wave" x="259.2" y="385.7" width="7.0" height="66.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-129ms"/&gt;
&lt;rect class="wave" x="271.4" y="387.5" width="7.0" height="63.0" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-266ms"/&gt;
&lt;rect class="wave" x="283.6" y="382.0" width="7.0" height="74.1" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-403ms"/&gt;
&lt;rect class="wave" x="295.8" y="399.3" width="7.0" height="39.4" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-540ms"/&gt;
&lt;rect class="wave" x="308.0" y="396.2" width="7.0" height="45.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-677ms"/&gt;
&lt;rect class="wave" x="320.2" y="398.2" width="7.0" height="41.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-814ms"/&gt;
&lt;rect class="wave" x="332.4" y="390.2" width="7.0" height="57.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-951ms"/&gt;
&lt;rect class="wave" x="344.6" y="387.6" width="7.0" height="62.9" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-1088ms"/&gt;
&lt;rect class="wave" x="356.8" y="384.7" width="7.0" height="68.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-125ms"/&gt;
&lt;rect class="wave" x="369.0" y="378.2" width="7.0" height="81.6" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-262ms"/&gt;
&lt;rect class="wave" x="381.2" y="390.4" width="7.0" height="57.2" rx="3.5" fill="url(#pu-wave)" style="animation-delay:-399ms"/&gt;
&lt;/g&gt;
&lt;g class="s12" data-act="record" role="button" tabindex="0" aria-label="Record, shows the permission prompt"&gt;&lt;rect class="red" x="37" y="486" width="366" height="54" rx="18"/&gt;&lt;circle cx="73" cy="513" r="9" fill="none" stroke="#fff" stroke-width="2.2"/&gt;&lt;circle cx="73" cy="513" r="4" fill="#fff"/&gt;&lt;text x="95" y="519" font-size="17" font-weight="600" fill="#fff"&gt;Record&lt;/text&gt;&lt;rect class="hit" x="37" y="486" width="366" height="54" rx="18"/&gt;&lt;/g&gt;
&lt;g class="s3" data-act="reset" role="button" tabindex="0" aria-label="Stop capture, returns to the start"&gt;&lt;rect class="red" x="37" y="486" width="366" height="54" rx="18"/&gt;&lt;rect x="67" y="507" width="12" height="12" rx="2.5" fill="#fff"/&gt;&lt;text x="95" y="519" font-size="17" font-weight="600" fill="#fff"&gt;Stop capture&lt;/text&gt;&lt;rect class="hit" x="37" y="486" width="366" height="54" rx="18"/&gt;&lt;/g&gt;
&lt;rect class="card" x="37" y="554" width="366" height="128" rx="22"/&gt;
&lt;text x="59" y="583" font-size="17" font-weight="600"&gt;What the app can see&lt;/text&gt;
&lt;g class="s3"&gt;&lt;text class="mono g2" x="59" y="609" font-size="12"&gt;TCC decision&lt;/text&gt;&lt;text class="mono red" x="385" y="609" font-size="12" text-anchor="end" font-weight="600"&gt;denied&lt;/text&gt;&lt;/g&gt;
&lt;g class="s3"&gt;&lt;text class="mono g2" x="59" y="628" font-size="12"&gt;Token installed&lt;/text&gt;&lt;text class="mono g2" x="385" y="628" font-size="12" text-anchor="end" font-weight="600"&gt;audiomxd&lt;/text&gt;&lt;/g&gt;
&lt;g class="s3"&gt;&lt;text class="mono g2" x="59" y="647" font-size="12"&gt;SetProperty(2009)&lt;/text&gt;&lt;text class="mono ok" x="385" y="647" font-size="12" text-anchor="end" font-weight="600"&gt;noErr&lt;/text&gt;&lt;/g&gt;
&lt;g class="s3"&gt;&lt;text class="mono g2" x="59" y="666" font-size="12"&gt;Samples received&lt;/text&gt;&lt;text class="mono ok" x="385" y="666" font-size="12" text-anchor="end" font-weight="600"&gt;non-silent&lt;/text&gt;&lt;/g&gt;
&lt;text class="mono g2 s12" x="59" y="609" font-size="12"&gt;nothing yet&lt;/text&gt;
&lt;g class="s2"&gt;
&lt;rect class="dim" x="19" y="21" width="402" height="874"/&gt;
&lt;rect class="sheet" x="85.0" y="321" width="270" height="158" rx="14"/&gt;
&lt;text x="220.0" y="351" text-anchor="middle" font-size="14.5" font-weight="700"&gt;&amp;#8220;RemoteIO Mic Demo&amp;#8221; Would&lt;/text&gt;
&lt;text x="220.0" y="369" text-anchor="middle" font-size="14.5" font-weight="700"&gt;Like to Access the Microphone&lt;/text&gt;
&lt;text class="g2" x="220.0" y="393" text-anchor="middle" font-size="11.5"&gt;This proof-of-concept validates whether&lt;/text&gt;
&lt;text class="g2" x="220.0" y="408" text-anchor="middle" font-size="11.5"&gt;RemoteIO enforces microphone&lt;/text&gt;
&lt;text class="g2" x="220.0" y="423" text-anchor="middle" font-size="11.5"&gt;authorization.&lt;/text&gt;
&lt;line class="hair" x1="85.0" y1="435" x2="355.0" y2="435"/&gt;
&lt;line class="hair" x1="220.0" y1="435" x2="220.0" y2="479"/&gt;
&lt;g data-act="deny" role="button" tabindex="0" aria-label="Don't Allow, refuses microphone access"&gt;
&lt;text class="tint" x="152.5" y="463" text-anchor="middle" font-size="15" font-weight="600"&gt;Don't Allow&lt;/text&gt;
&lt;rect x="102" y="441" width="101" height="30" rx="8" fill="none" stroke="#007aff" stroke-opacity=".45" stroke-width="1.4" stroke-dasharray="3 2"/&gt;
&lt;circle class="tap" cx="152.5" cy="458" r="34" fill="#007aff" fill-opacity=".18" style="transform-box:fill-box;transform-origin:center"/&gt;
&lt;rect class="hit" x="86" y="435" width="134" height="44" rx="8"/&gt;
&lt;/g&gt;
&lt;text class="tint" x="287.5" y="463" text-anchor="middle" font-size="15"&gt;Allow&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;g class="s3" transform="translate(243 50.5)"&gt;&lt;circle class="noind-halo" r="7"/&gt;&lt;circle class="noind-ring" r="7"/&gt;&lt;circle class="noind-dot" r="3.2"/&gt;&lt;line class="noind-slash" x1="-4" y1="4" x2="4" y2="-4"/&gt;&lt;/g&gt;
&lt;rect class="bezel" x="8" y="10" width="424" height="896" rx="57"/&gt;
&lt;g class="annblk" data-ann="2"&gt;
&lt;text class="annb" x="463" y="44"&gt;The user refuses.&lt;/text&gt;
&lt;text class="ann" x="463" y="65"&gt;This is the real system prompt.&lt;/text&gt;
&lt;path class="lead" d="M453 40 L445 40 L445 462 L362 462" marker-end="url(#pu-a)"/&gt;
&lt;/g&gt;
&lt;g class="annblk" data-ann="3"&gt;
&lt;text class="annb" x="463" y="252"&gt;The refusal is recorded correctly.&lt;/text&gt;
&lt;text class="ann" x="463" y="273"&gt;AVAudioApplication.shared.recordPermission&lt;/text&gt;
&lt;text class="ann" x="463" y="292"&gt;returns denied for the whole run.&lt;/text&gt;
&lt;path class="lead" d="M453 288 L369 289" marker-end="url(#pu-a)"/&gt;
&lt;/g&gt;
&lt;g class="annblk" data-ann="3"&gt;
&lt;text class="annb" x="463" y="396"&gt;Capture starts anyway.&lt;/text&gt;
&lt;text class="ann" x="463" y="417"&gt;The meter is fed from the render callback,&lt;/text&gt;
&lt;text class="ann" x="463" y="436"&gt;which receives non-silent samples. With&lt;/text&gt;
&lt;text class="ann" x="463" y="455"&gt;audiomxd's token installed, the daemon&lt;/text&gt;
&lt;text class="ann" x="463" y="474"&gt;matched itself and never asked TCC.&lt;/text&gt;
&lt;path class="lead" d="M453 424 L396 424" marker-end="url(#pu-a)"/&gt;
&lt;/g&gt;
&lt;g class="annblk" data-ann="3"&gt;
&lt;g transform="translate(447 550.5)"&gt;&lt;circle class="noind-halo" r="7"/&gt;&lt;circle class="noind-ring" r="7"/&gt;&lt;circle class="noind-dot" r="3.2"/&gt;&lt;line class="noind-slash" x1="-4" y1="4" x2="4" y2="-4"/&gt;&lt;/g&gt;
&lt;text class="annb" x="463" y="556"&gt;And nothing lights up.&lt;/text&gt;
&lt;text class="ann" x="463" y="577"&gt;The orange microphone indicator would sit&lt;/text&gt;
&lt;text class="ann" x="463" y="596"&gt;inside the Dynamic Island, where the dashed&lt;/text&gt;
&lt;text class="ann" x="463" y="615"&gt;ring is. It never appeared there, nor in&lt;/text&gt;
&lt;text class="ann" x="463" y="634"&gt;Control Center.&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;

&lt;script&gt;
(function () {
 var figs = document.querySelectorAll('.pocui');
 for (var i = 0; i &lt; figs.length; i++) {
 (function (fig) {
 fig.setAttribute('data-js', '1');
 fig.setAttribute('tabindex', '0');

 var clock = fig.querySelector('[data-clock]');
 var brand = fig.querySelector('[data-brand]');
 if (clock) {
 try {
 var now = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });
 clock.textContent = now.replace(/^24:/, '00:');
 if (brand) {
 var x = Math.round(49 + clock.getBBox().width + 12);
 brand.setAttribute('x', String(x));
 var island = fig.querySelector('.island');
 var limit = island ? Number(island.getAttribute('x')) - 8 : 999;
 if (x + brand.getBBox().width &gt; limit) {
 brand.style.display = 'none';
 }
 }
 } catch (e) {
 
 }
 }
 var chips = fig.querySelectorAll('[data-goto]');
 var blocks = fig.querySelectorAll('[data-ann]');
 var toggle = fig.querySelector('[data-pocui="toggle"]');
 var LAST = 3;
 var DWELL = [0, 1300, 2400];
 var step = LAST;
 var mode = 'replay';
 var timer = null;

 function stopTimer() {
 if (timer !== null) {
 clearTimeout(timer);
 timer = null;
 }
 }

 function setMode(next) {
 mode = next;
 fig.setAttribute('data-mode', next);
 var label = 'Play';
 if (next === 'playing') { label = 'Pause'; }
 if (next === 'replay') { label = 'Replay'; }
 toggle.setAttribute('aria-label', label);
 }

 function paint(n) {
 step = n;
 fig.setAttribute('data-step', String(n));
 for (var j = 0; j &lt; chips.length; j++) {
 chips[j].setAttribute('aria-pressed', String(Number(chips[j].getAttribute('data-goto')) === n));
 }
 for (var k = 0; k &lt; blocks.length; k++) {
 blocks[k].classList.toggle('on', Number(blocks[k].getAttribute('data-ann')) &lt;= n);
 }
 }

 function advance() {
 if (step &gt;= LAST) {
 setMode('replay');
 return;
 }
 timer = setTimeout(function () {
 paint(step + 1);
 advance();
 }, DWELL[step]);
 }

 function play(from) {
 stopTimer();
 if (typeof from === 'number') { paint(from); }
 if (step &gt;= LAST) { paint(1); }
 setMode('playing');
 advance();
 }

 function pause() {
 stopTimer();
 setMode(step &gt;= LAST ? 'replay' : 'play');
 }

 function goTo(n) {
 stopTimer();
 if (n &lt; 1) { n = 1; }
 if (n &gt; LAST) { n = LAST; }
 paint(n);
 setMode(n &gt;= LAST ? 'replay' : 'play');
 }

 function doAct(what) {
 if (what === 'record' &amp;&amp; step === 1) { goTo(2); return; }
 
 if (what === 'deny' &amp;&amp; step === 2) { goTo(3); return; }
 if (what === 'reset') { goTo(1); }
 }

 fig.addEventListener('click', function (ev) {
 var chip = ev.target.closest('[data-goto]');
 if (chip) { goTo(Number(chip.getAttribute('data-goto'))); return; }
 if (ev.target.closest('[data-pocui="toggle"]')) {
 if (mode === 'playing') { pause(); } else { play(); }
 return;
 }
 var act = ev.target.closest('[data-act]');
 if (act) { doAct(act.getAttribute('data-act')); }
 });

 fig.addEventListener('keydown', function (ev) {
 if (ev.key === 'ArrowLeft') { goTo(step - 1); ev.preventDefault(); return; }
 if (ev.key === 'ArrowRight') { goTo(step + 1); ev.preventDefault(); return; }
 if (ev.key === 'Home') { goTo(1); ev.preventDefault(); return; }
 if (ev.key === 'End') { goTo(LAST); ev.preventDefault(); }
 });

 fig.addEventListener('keydown', function (ev) {
 if (ev.key !== 'Enter' &amp;&amp; ev.key !== ' ') { return; }
 var act = ev.target.closest ? ev.target.closest('[data-act]') : null;
 if (act) { doAct(act.getAttribute('data-act')); ev.preventDefault(); }
 });

 paint(LAST);
 setMode('replay');
 if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches &amp;&amp; 'IntersectionObserver' in window) {
 var seen = false;
 var io = new IntersectionObserver(function (entries) {
 for (var e = 0; e &lt; entries.length; e++) {
 if (entries[e].isIntersecting &amp;&amp; !seen) {
 seen = true;
 io.disconnect();
 play(1);
 }
 }
 }, { threshold: 0.4 });
 io.observe(fig);
 }
 })(figs[i]);
 }
})();
&lt;/script&gt;
&lt;style&gt;
.pocui{display:block}
.pocui-svg{display:block;width:100%;height:auto}
&lt;/style&gt;

&lt;p&gt;The bypass is one &lt;code&gt;AudioUnitSetProperty&lt;/code&gt; call carrying the audio daemon's own audit token, which the kernel hands the app on request. Told &lt;em&gt;I am audiomxd&lt;/em&gt;, audiomxd decides the client is itself and sends it real microphone samples.&lt;/p&gt;
&lt;p&gt;Reproduced on iPadOS 27.0 beta &lt;code&gt;24A5390f&lt;/code&gt; and iOS 26.6 &lt;code&gt;23G71&lt;/code&gt;. Fixed in iOS and iPadOS 26.6.1, macOS Tahoe 26.6.2 and the later releases below. Apple said another researcher reported it first. The 17 August advisories initially credited Nik Tsytsarkin of Meta Red Team X, and Apple added my name to them on 14 September.&lt;/p&gt;</description></item></channel></rss>