<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Breach Rift]]></title><description><![CDATA[Breach Rift]]></description><link>https://breachrift.pro</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 11:32:24 GMT</lastBuildDate><atom:link href="https://breachrift.pro/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Understanding Linux File Permissions and SUID for Privilege Escalation]]></title><description><![CDATA[Linux file permissions are a double‑edged weapon. When used correctly, they provide a fundamental security layer; when misconfigured, they often become one of the earliest and most critical attack surfaces in Unix‑like systems.
In real‑world attacks,...]]></description><link>https://breachrift.pro/understanding-linux-file-permissions-and-suid-for-privilege-escalation</link><guid isPermaLink="true">https://breachrift.pro/understanding-linux-file-permissions-and-suid-for-privilege-escalation</guid><category><![CDATA[Root]]></category><category><![CDATA[Linux]]></category><category><![CDATA[hacking]]></category><category><![CDATA[Privilege Escalation]]></category><category><![CDATA[suid]]></category><category><![CDATA[permissions]]></category><dc:creator><![CDATA[ptrveil]]></dc:creator><pubDate>Thu, 01 Jan 2026 23:56:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767132967736/4a258a00-73d1-4c8f-9710-755a9aaef27d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Linux file permissions are a double‑edged weapon. When used correctly, they provide a fundamental security layer; when misconfigured, they often become one of the earliest and most critical attack surfaces in Unix‑like systems.</p>
<p>In real‑world attacks, permission misconfigurations frequently serve as an initial foothold or a privilege‑escalation vector.</p>
<p>Every file or directory in Linux systems has three layers of permissions</p>
<pre><code class="lang-markdown">User (u) | Group (g) | Others (o)
</code></pre>
<p>Each permission layer consist of three main permissions</p>
<pre><code class="lang-markdown">Read (r) | Write (w) | Execute (x)
</code></pre>
<p>Below is a clarification for each permission and its effect for both files and directories</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Permission</td><td>Files</td><td>Directories</td></tr>
</thead>
<tbody>
<tr>
<td>Read (r)</td><td>View files content</td><td>List files (names only) inside the directory</td></tr>
<tr>
<td>Write (w)</td><td>Modify files content</td><td>Create, delete, or rename files (directory entries)</td></tr>
<tr>
<td>Execute (x)</td><td>Run executable files</td><td>Enter the directory and access files by name</td></tr>
</tbody>
</table>
</div><p>Each Permission has Octal (Numeric Representation in Unix based Systems), Permissions are combined by summing their values:</p>
<pre><code class="lang-bash">Read (4) | Write (2) | Execute (1)
</code></pre>
<p>At first glance, this may seem purely theoretical or even boring. However, in the world of cybersecurity and offensive security, these concepts play a dangerous and powerful role.</p>
<p>Once you truly understand Linux permissions, an entirely new class of misconfigurations, privilege‑escalation paths, and exploit opportunities becomes visible.</p>
<p>Let’s put this to practice</p>
<pre><code class="lang-bash">ls -l /etc/passwd
</code></pre>
<p>You’ll get something like this</p>
<pre><code class="lang-bash">-rw-r--r--. 1 root root 3322 Dec 21 18:45 /etc/passwd
</code></pre>
<p>To read this correctly let’s divide the permissions into 5 parts <code>[-][rw-][r—][r—][.]</code></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Segment</td><td>Value</td><td>Interpretation</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>-</td><td>This indicates entry type (- for files, d for directories)</td></tr>
<tr>
<td>2</td><td>rw-</td><td>Owner (u) Permission : Read and Write</td></tr>
<tr>
<td>3</td><td>r—</td><td>Group (g) Permissions : Read</td></tr>
<tr>
<td>4</td><td>r—</td><td>Others (o) Permissions : Read</td></tr>
<tr>
<td>5</td><td>.</td><td>This dot (.) indicates that SELinux security context is applied to this file</td></tr>
</tbody>
</table>
</div><h2 id="heading-set-and-manage-permissions">Set and Manage Permissions</h2>
<p>Understanding Linux permissions is not very useful unless you know how to change and manage them correctly. Linux provides a simple but powerful tool for this job: <code>chmod</code> (Change Mode)</p>
<p>chmod has two main ways to set or modify permissions :</p>
<ul>
<li><p><strong>Numeric</strong> (Octal) mode</p>
</li>
<li><p><strong>Symbolic</strong> (Characters / abbreviations) mode</p>
</li>
</ul>
<h3 id="heading-set-permissions-octal-mode">Set Permissions (Octal Mode)</h3>
<p>Octal mode is the most direct way to set permissions and used widely and commonly in scripts and automation for its simplicity and directness, the general command format looks like the following example</p>
<pre><code class="lang-bash">chmod 755 script.sh
</code></pre>
<p>Each number represent the sum of permissions for a specific layer as follow</p>
<pre><code class="lang-bash">[User : 7] [Group : 5] [Others : 5]
</code></pre>
<p>Which can translate in other words</p>
<pre><code class="lang-bash">[User : 7 = Read, Write and Execute (4+2+1)]
[Group : 5 = Read and Execute (4+1)]
[Others : 5 = Read and Execute (4+1)]
</code></pre>
<p>Now let’s read and interpret some common octal permissions that is used widely</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Permission</td><td>Interpretation</td></tr>
</thead>
<tbody>
<tr>
<td>644</td><td>Read and Write for owner and read only for anyone else</td></tr>
<tr>
<td>755</td><td>Common for executables and directories; writable only by the owner</td></tr>
<tr>
<td>600</td><td>Common for private files, Read and write for user (only) and no access for others</td></tr>
<tr>
<td>777</td><td>Full access for everyone, very <strong>dangerous</strong></td></tr>
</tbody>
</table>
</div><p><strong>Hacker Note</strong> : always keep an eye on 777 files and directory, they are gold mines</p>
<h3 id="heading-set-permissions-symbolic-mode">Set Permissions (Symbolic Mode)</h3>
<p>Symbolic mode is more readable, precise and safer when you want to make small, controlled changes without affecting existing permissions.</p>
<p>General format for symbolic mode is the following</p>
<pre><code class="lang-bash">chmod [who][operation][permission]
</code></pre>
<p>Where [who] specify the layer (optional, default all <code>a</code>) :</p>
<pre><code class="lang-markdown">u : User, g : Group, o : Others, a : all (u,g,o)
</code></pre>
<p>[operation] specify what you actually want to do :</p>
<pre><code class="lang-markdown"><span class="hljs-bullet">+</span> : Give Permission, - : Remove/Revoke Permission, = : Set Exactly
</code></pre>
<p>[permission] is the actual symbolic representation for the permissions</p>
<pre><code class="lang-markdown">r : Read, w : Write, x : Execute
</code></pre>
<p>Below are some common examples with explanation for a clearer image</p>
<p><strong>Set a script as executable</strong></p>
<pre><code class="lang-bash">chmod +x script.sh 
<span class="hljs-comment"># Give (+) Execute (x) permission to all (a : default in absence)</span>
<span class="hljs-comment"># Equivalent : chmod a+x script.sh</span>
</code></pre>
<p><strong>Remove write permission from others</strong></p>
<pre><code class="lang-bash">chmod o-w my_directory 
<span class="hljs-comment"># Remove (-) Write (w) permissions from others (o)</span>
</code></pre>
<p><strong>Set Specific Permissions</strong></p>
<pre><code class="lang-bash">chmod u=rwx,g=rx,o= my_file.sh 
<span class="hljs-comment"># For user (u) set (=) permissions as Read,Write and Execute (rwx)</span>
<span class="hljs-comment"># For group (g) set (=) permissions as Read and Execute (rx)</span>
<span class="hljs-comment"># For others (o) set (=) permissions as none</span>
<span class="hljs-comment"># Equivalent : chmod 750 my_file.sh</span>
</code></pre>
<h3 id="heading-set-permissions-recursively">Set Permissions Recursively</h3>
<p>Permissions can also be changed recursively using <code>-R</code> flag:</p>
<pre><code class="lang-bash">chmod -R 755 my_directory
</code></pre>
<p>recursively indicates setting permission to all files and sub-directories within the specified directory, and this should be used with much care and remember this</p>
<blockquote>
<p>Many exploits and privilege escalations started with a careless <code>chmod</code></p>
</blockquote>
<h3 id="heading-verify-permissions">Verify Permissions</h3>
<p>Always verify permissions after changing, don’t assume</p>
<pre><code class="lang-bash">ls -l my_file
</code></pre>
<blockquote>
<p>Never assume, always check</p>
</blockquote>
<h2 id="heading-special-permission-bits-suid-sgid-and-the-sticky-bit">Special Permission Bits: SUID, SGID, and the Sticky Bit</h2>
<p>So far, Linux permissions have been mostly about who is allowed to do what. Special permission bits are where things start to bend those rules. SUID, SGID, and the Sticky Bit exist for good reasons, but they also introduce behavior that many admins don’t fully think through, and that’s exactly why they matter from a red team perspective.</p>
<p>When you land a low‑privileged shell on a box, these bits are usually among the first things you look for. A forgotten SUID binary, a shared directory with a loose SGID, or a writable location missing a sticky bit can quietly change the game and <strong>turn a normal user into something much more interesting</strong>. These aren’t flashy misconfigurations, they blend in, they look “<strong>normal</strong>”, and they often sit untouched for years.</p>
<p>Before getting into how they’re abused, it’s worth understanding what these bits actually do and why they exist, because a lot of real‑world privilege escalation paths start with nothing more than a small permission decision that seemed harmless at the time.</p>
<h3 id="heading-special-permission-bits-what-is-this">Special Permission Bits ! What is this ?</h3>
<p>In Linux, permissions don’t stop at the usual read, write, and execute. There’s a layer on top called special permission bits, which slightly bend the normal rules and give files or directories extra behavior.</p>
<p>There are three special bits</p>
<pre><code class="lang-bash">SUID | SGID | Sticky
</code></pre>
<p>They were designed to solve practical problems in multi-user systems, but from a security perspective, they’re also tiny “windows” that can make a normal user more powerful if misconfigured.</p>
<p><strong>SUID (Set User ID)</strong></p>
<p><strong>User perspective</strong>: When SUID is set on a binary, the program runs with the privileges of the file owner rather than the user who executed it. This exists for legitimate reasons. A classic example is passwd: normal users need to modify /etc/shadow, but giving everyone direct write access to that file would be a disaster. SUID solves this by allowing the binary to temporarily act with higher privileges while performing a very specific task.</p>
<p><strong>Hacker perspective</strong>: From an attacker’s point of view, this is where things get interesting. If an executable is owned by root and has the SUID bit set, running it means the process executes as root. That alone doesn’t guarantee an exploit, but it immediately raises a flag. If I can influence how this binary behaves, abuse its input, environment, or logic, then I’m no longer executing code as a low‑privileged user — I’m executing code as root. One weak SUID binary is often all it takes to turn local access into full system compromise.</p>
<p><strong>SGID (Set Group ID)</strong></p>
<p><strong>User perspective</strong>: When SGID is set on a file, the program runs with the privileges of the file’s group instead of the user’s primary group. When set on a directory, any new files created inside inherit the directory’s group automatically. This is commonly used in shared environments to make collaboration easier, ensuring multiple users can work on the same set of files without constantly fixing ownership or permissions.</p>
<p><strong>Hacker perspective</strong>: From an attacker’s point of view, SGID is quieter than SUID but still worth attention. A binary running with elevated group privileges can open access to files or resources that aren’t normally available to the current user. SGID directories are even more interesting, especially when combined with weak write permissions. Group inheritance sounds harmless until you realize it can be abused to gain access to sensitive group‑owned files, manipulate shared resources, or pivot into other users’ workflows. It’s rarely the final step, but it often helps build one.</p>
<p><strong>Sticky Bit</strong></p>
<p><strong>User perspective</strong>: The sticky bit is mostly used on directories and controls who is allowed to delete or rename files inside them. When set, only the file owner, directory owner, or root can remove files, even if the directory itself is world‑writable. The classic example is <code>/tmp</code>, where everyone needs write access, but no one should be able to delete other users’ files.</p>
<p><strong>Hacker perspective</strong>: From a red team perspective, the sticky bit is about containment. When it’s present, it prevents easy abuse of shared writable directories. When it’s missing, things can get messy very quickly. World‑writable directories without the sticky bit allow attackers to delete, replace, or hijack files created by other users or processes. That opens the door to race conditions, symlink attacks, and all kinds of quiet privilege escalation tricks that don’t look suspicious until it’s too late.</p>
<h3 id="heading-manage-special-bits">Manage Special Bits</h3>
<p>Granting and revoking special bits from files and directories works the as normal permissions with chmod (octal and symbolic modes)</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Special Bit</td><td><strong>Symbolic</strong></td><td><strong>Octal</strong></td></tr>
</thead>
<tbody>
<tr>
<td>SUID</td><td>s</td><td>4</td></tr>
<tr>
<td>SGID</td><td>s</td><td>2</td></tr>
<tr>
<td>Sticky Bit</td><td>t</td><td>1</td></tr>
</tbody>
</table>
</div><p>You may notice that SUID and SGID are both referenced in symbolic mode by “<strong>s</strong>”, and this is not a typo, it is totally okay and there will be no conflicts since SUID is only set on User Permissions (u), while SGID is only set on Group Permissions (g).</p>
<p>Now let’s see few example on Special Bits Assignment using Symbolic Mode</p>
<pre><code class="lang-bash">chmod u+s myfile <span class="hljs-comment"># Add SUID (s) to myfile</span>
chmod u-s myfile <span class="hljs-comment"># Remove SUID (s) from myfile</span>

chmod g+s myfile <span class="hljs-comment"># Add SGID (s) to myfile</span>
chmod g-s myfile <span class="hljs-comment"># Remove SGID (s) from myfile</span>

chmod +t myfile <span class="hljs-comment"># Add Sticky bit to myfile</span>
chmod -t myfile <span class="hljs-comment"># Remove Sticky bit from myfile</span>
</code></pre>
<p>Notice we used Symbol “<strong>s</strong>” for both SUID and SGID, but when it’s add to User (u) then system knows it’s SUID and when added to Group (g), then it will be SGID</p>
<p>When it comes to Octal mode, we use same concept as normal permissions, we sum the values if bits we want to add as following</p>
<pre><code class="lang-bash">chmod 4755 myfile <span class="hljs-comment"># Set Bits of myfile as SUID (4)</span>
chmod 2755 myfile <span class="hljs-comment"># Set Bits of myfile as SGID (2)</span>
chmod 1755 myfile <span class="hljs-comment"># Set Bits of myfile as Sticky (1)</span>

chmod 6755 myfile <span class="hljs-comment"># Set Bits of myfile as SUID + SGID (4+2)</span>

chmod 0775 myfile <span class="hljs-comment"># Remove all special bits from myfile</span>
</code></pre>
<p>Note that now when we use 4 digits permissions system when having Special Bits with the following format</p>
<pre><code class="lang-markdown">Special Bit | User Permissions | Group Permissions | Others Permissions
</code></pre>
<p>It also worth having a look on how a file with special bits will look like, if we ls a file with all special bits it should like like this</p>
<pre><code class="lang-markdown">$ ls -l myfile
-rwsr-sr-t. 1 ptrveil ptrveil 0 Jan  1 23:33 myfile
</code></pre>
<p>Now you may notice that “x” is replaced with “s” within user permission which means this file has SUID (s in user = SUID), while “x” is replaced with s within group permissions (s in group = SGID), finally “x” in other replaced with “t” (t in other = Sticky). Below is a conclusion table for symbolic reference</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td><strong>User (u)</strong></td><td><strong>Group (g)</strong></td><td><strong>Other (o)</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>r</strong></td><td>Read</td><td>Read</td><td>Read</td></tr>
<tr>
<td><strong>w</strong></td><td>Write</td><td>Write</td><td>Write</td></tr>
<tr>
<td><strong>x</strong></td><td>Execute</td><td>Execute</td><td>Execute</td></tr>
<tr>
<td><strong>s</strong></td><td>SUID</td><td>SGID</td><td>-</td></tr>
<tr>
<td><strong>t</strong></td><td>-</td><td>-</td><td>Sticky Bit</td></tr>
</tbody>
</table>
</div><h2 id="heading-hacking-time-hunting-special-bits-for-privilege-escalation"><strong>Hacking Time: Hunting Special Bits for Privilege Escalation</strong></h2>
<p>At this point we understand how permissions and special bits works, so its time to stop thinking as system administrators and start thinking as attackers.</p>
<p>When you get on a low privileged shell during a penetration test of a red team engagement, your goal is simply get as powerful as possible and aiming for root access. Sometimes you don’t need zero-days, kernel exploits or even fancy payloads. If you are able to spot and hunt one mis-configured permission or a careless SUID, then it’s potentially this is your door to Privilege Escalation and maybe root.</p>
<p>Special bit are most often the first thing i hunt after initial access, they are easy to enumerate and also hard to notice for regular operations cause the are legit for the system and looks normal and they are frequently misconfigured on many targets.</p>
<p>Now let’s stop talking about theories and see how this work from an attacker side in a seamless workflow</p>
<h3 id="heading-step1-hunting-suid-files">Step.1 : Hunting SUID Files</h3>
<p>This is usually your first step, because if you get something interesting … your objective complete</p>
<pre><code class="lang-bash"><span class="hljs-comment">#Find all SUID files</span>
find / -perm -4000 -<span class="hljs-built_in">type</span> f 2&gt;/dev/null
</code></pre>
<p>Now you’ll get all files with SUID special bit on it, and from an attacker perspective below is what you are looking for in the list you got :</p>
<ul>
<li><p>Executables owned by root</p>
</li>
<li><p>Are they common executables or custom script</p>
</li>
<li><p>Are they accepting user input ?</p>
</li>
<li><p>Can you influence their PATH, arguments or environment</p>
</li>
</ul>
<h3 id="heading-step11-influence-and-identified-suid">Step.1.1 : Influence and Identified SUID</h3>
<p>Let’s say you found <code>find</code> executable with SUID bit, now it’s time to investigate more on this as following :</p>
<ul>
<li><p>Is this a common executable : Yes</p>
</li>
<li><p>Is it accepting user inputs : Yes</p>
</li>
<li><p>Can you influence its Path, arguments or environment : Yes, somehow</p>
</li>
</ul>
<p><code>find</code> is a common executable in Linux that allows searching and finding files and it is accepting user input and arguments, one of those arguments is <code>-exec</code> , it is used for executing a command for each file you find, so it’s legit for the system and doesn’t raise much noise, so in other words : <code>find</code> can execute or run other executables and since <code>find</code> is owned by <strong>root</strong> and has <strong>SUID</strong> so it will run as a root and if we use find to execute another command it will accordingly run as root as well … so it may be the time influence this executable</p>
<pre><code class="lang-bash">find . -<span class="hljs-built_in">exec</span> /bin/sh \; -quit
</code></pre>
<p>Now what this really means, and what do we expect form. First of all this is a legit and command command, and below what is means</p>
<ul>
<li><p>find : find all files and directories</p>
</li>
<li><p>. : with in the current directory (where find starts)</p>
</li>
<li><p>-exec : and execute the following command for each finding</p>
</li>
<li><p>/bin/sh : the shell <code>sh</code> (or <code>bash</code> if available)</p>
</li>
<li><p>\; : ending the shell command</p>
</li>
<li><p>-quit : stop after first finding (we actually need just one finding for the shell to come up)</p>
</li>
</ul>
<p>If everything runs well, then you are now expecting a <strong>shell</strong> with <strong>root</strong> user instantly, no more kernel exploiting or complex buffer overflow needed.</p>
<p><strong>Note</strong>: In real world you don’t need to know all commands with arguments and parameters, you don’t really need to memorize it at all, resources are available to help. One of the best resources to find if you can exploit a SUID is <a target="_blank" href="https://gtfobins.github.io/"><strong>GTFO-Bins</strong></a>, it helps you search for a common executable and see if it can be used for Privilege Escalation.</p>
<h3 id="heading-step2-hunting-sgid-files-and-directories">Step.2: Hunting SGID Files and Directories</h3>
<p>SGID are quieter than SUID but it still so useful for lateral movement and escalation, so consider them as a tool to open a locked door, while SUID is an already open door.</p>
<p><strong>Find SGID Files</strong></p>
<pre><code class="lang-bash">find / -perm -2000 -<span class="hljs-built_in">type</span> f 2&gt;/dev/null
</code></pre>
<p><strong>Find SGID Directories</strong></p>
<pre><code class="lang-bash">find / -perm -2000 -<span class="hljs-built_in">type</span> d 2&gt;/dev/null
</code></pre>
<p><strong>What do you expect from a SGID file or a directory</strong></p>
<ul>
<li><p>Access to a group restricted content</p>
</li>
<li><p>Ability to write files with a privileged group</p>
</li>
<li><p>Manipulation of shared or trusted resources</p>
</li>
<li><p>A first step to setup upcoming attacks (malicious crons, scripts or configurations using a trusted group)</p>
</li>
</ul>
<h3 id="heading-step2-enumerate-world-writable-directories">Step.2: Enumerate world-writable directories</h3>
<p>This is where attacks can be quite, nasty and dangerous. World-writable directories specially ones without Sticky-Bit can be very dangerous if you find your sneaky strategy to make use it</p>
<pre><code class="lang-bash">find / -perm -0002 -<span class="hljs-built_in">type</span> d 2&gt;/dev/null
</code></pre>
<p>In the above command we are looking for directories (d) in the root directory (/) where it has write permissions (2) in the others permissions.</p>
<p>If you find any, then you next enumeration is to check for Sticky-Bit flag (we are looking for no sticky-bit flag), let’s quote from what we said about sticky-bit for more clearance and to know why we are looking for no sticky-bit</p>
<blockquote>
<p>When set, only the file owner, directory owner, or root can remove files</p>
</blockquote>
<pre><code class="lang-bash">ls -ld /path/to/directory/you/found
<span class="hljs-comment"># Check if you see "t" flag in permissions</span>
<span class="hljs-comment"># if not then you are very close now</span>
</code></pre>
<p>If you find any without sticky-bit, then it will be potentially vulnerable to delete / replacing files, symlink attack, script hijacking or race condition abuse.</p>
<h2 id="heading-final-thoughts-small-bits-big-impact">Final Thoughts: Small Bits, Big Impact</h2>
<p>Linux permission bits are often treated as basic system knowledge, something that administrators learn once and never revisit. But as we’ve seen, SUID, SGID, sticky bits, and world-writable permissions are not just implementation details, they are decision points that directly affect system security.</p>
<p>From a red team perspective, privilege escalation is rarely about exploiting a complex vulnerability, it can be as simple as a careless <code>chmod</code> or <code>chown</code> ran by an administrator.</p>
<p>If you remember one thing from this guide, let it be this:</p>
<blockquote>
<p>Every permission bit is a promise. When that promise is broken, escalation becomes inevitable.</p>
</blockquote>
<p>Finally</p>
<p>Audit your permissions or someone else will.</p>
<p>Happy hunting.</p>
]]></content:encoded></item><item><title><![CDATA[The Silent Trap - Ubuntu 24 on Fedora (virt-manager)]]></title><description><![CDATA[While installing Ubuntu 24 as a virtual machine on Fedora using virt-manager, the installer may appear to start normally, only to disappear into silence. The splash screen shows up, the screen goes black, the mouse cursor turns into a black “X”, and ...]]></description><link>https://breachrift.pro/the-silent-trap-ubuntu-24-on-fedora-virt-manager</link><guid isPermaLink="true">https://breachrift.pro/the-silent-trap-ubuntu-24-on-fedora-virt-manager</guid><category><![CDATA[Linux]]></category><category><![CDATA[Fedora]]></category><category><![CDATA[virtual machine]]></category><category><![CDATA[virtualization]]></category><category><![CDATA[virt-manager]]></category><category><![CDATA[QXL]]></category><category><![CDATA[Virtual Reality]]></category><dc:creator><![CDATA[ptrveil]]></dc:creator><pubDate>Mon, 29 Dec 2025 21:46:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767044483459/0461fd4d-9629-420d-a28b-a4f515853f74.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>While installing Ubuntu 24 as a virtual machine on Fedora using virt-manager, the installer may appear to start normally, only to disappear into silence. The splash screen shows up, the screen goes black, the mouse cursor turns into a black “X”, and then you hear the Ubuntu welcome sound. The system is clearly alive — but nothing is visible, and installation becomes impossible.</p>
<h2 id="heading-stage-one-the-black-screen-illusion"><strong>Stage One – The Black Screen Illusion</strong></h2>
<p>At first glance, this looks like a graphical crash. Many people assume the installer froze, or that Wayland failed, or that the ISO is corrupted. In reality, none of that is true.</p>
<p>The installer is running. Audio works. The system reaches the desktop environment. You are simply not seeing it.</p>
<p>That’s what makes this issue dangerous. It fails silently, without logs or warnings, and it looks far more complex than it really is.</p>
<h2 id="heading-stage-two-the-real-cause-no-its-not-ubuntu">Stage Two - The Real Cause (No, It’s Not Ubuntu)</h2>
<p>The problem does not come from Ubuntu 24 itself, nor from Fedora. It comes from a small but critical default choice made by <strong>virt-manager</strong>.</p>
<p>By default, virt-manager sets the virtual display device to <strong>Virtio GPU</strong>. Under certain conditions, Ubuntu 24’s graphical installer fails to initialize properly with Virtio during early boot. When this happens, the system continues to load, but the display never renders.</p>
<p>That is why you hear sound but see nothing. The system isn’t broken — the screen is.</p>
<h2 id="heading-stage-three-disarming-the-trap-display-fix">Stage Three - Disarming the Trap (Display Fix)</h2>
<p>The fix starts with powering off the virtual machine completely. Once the VM is shut down, open its hardware settings in virt-manager and navigate to the display configuration.</p>
<p>Here is the key change: switch the display type from <strong>Virtio</strong> to <strong>QXL</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767044577858/723b06bf-f609-444e-8431-ca39caa811e8.png" alt class="image--center mx-auto" /></p>
<p>QXL is far more forgiving during graphical installation phases and tends to behave correctly with Ubuntu installers on Fedora hosts. After applying this change, start the virtual machine again.</p>
<p>In most cases, the installer UI immediately appears, as if nothing was ever wrong.</p>
<p>But sometimes, there is one more trap waiting.</p>
<h2 id="heading-stage-four-the-no-bootable-disk-found-ambush"><strong>Stage Four – The “No Bootable Disk Found” Ambush</strong></h2>
<p>After shutting down the VM to apply the display fix, you may be greeted by a completely different error:<br /><strong>“No bootable disk found.”</strong></p>
<p>This feels confusing and unrelated, but it’s actually another virt-manager quirk.</p>
<p>During shutdowns and hardware changes, virt-manager can leave behind an empty CDROM device. The ISO is silently detached, and the VM is left trying to boot from nothing.</p>
<h2 id="heading-stage-five-the-ghost-cdrom">Stage Five - The Ghost CDROM</h2>
<p>When you open the VM hardware list, you may notice a CDROM device with no ISO attached. This empty device blocks the boot process and triggers the misleading error.</p>
<p>The fix is simple but easy to overlook.</p>
<p>Remove the empty CDROM device entirely. Then add a new CDROM device and explicitly attach the Ubuntu 24 ISO again.</p>
<p>To avoid any ambiguity during boot, enable the boot menu and make sure the CDROM device is placed at the top of the boot order, followed by the main disk.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767044639475/197666b4-1551-4e72-aa06-5fececfea7ac.png" alt class="image--center mx-auto" /></p>
<p>Once applied, start the VM again.</p>
<p>This time, the installer boots normally and continues as expected.</p>
<h2 id="heading-why-this-hits-hackers-the-hardest"><strong>Why This Hits Hackers the Hardest</strong></h2>
<p>People working in offensive security rely heavily on virtual machines. We spin up labs, test unstable environments, and rebuild systems constantly. When something fails without feedback, it breaks flow and wastes time.</p>
<p>This issue is particularly frustrating because it feels deep and complex, when in reality it’s caused by two small configuration details: a display backend and an empty CDROM entry.</p>
<h2 id="heading-what-this-teaches-us"><strong>What This Teaches Us</strong></h2>
<p>A black screen with sound does not mean a frozen system. Virtio GPU is not always a safe default for graphical installers. QXL remains a reliable fallback when visuals disappear. And when a VM suddenly claims it has no boot device, always check the CDROM configuration first.</p>
<p>These small checks can save hours.</p>
<h2 id="heading-final-words-from-breachrift"><strong>Final Words from BreachRift</strong></h2>
<p>Virtualization is supposed to make experimentation painless. But sometimes, the smallest defaults become the sharpest traps.</p>
<p>This wasn’t an Ubuntu bug.<br />It wasn’t a Fedora issue.<br />It was a <strong>silent installer trap</strong>.</p>
<p>If this guide saved you time, frustration, or a full VM rebuild, then it served its purpose.</p>
<p>Break systems — not your workflow.</p>
<p>— <strong>BreachRift</strong></p>
]]></content:encoded></item></channel></rss>