<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Field Notes on ErrorZap</title><link>https://errorzap.com/categories/field-notes/</link><description>Recent content in Field Notes on ErrorZap</description><image><title>ErrorZap</title><url>https://errorzap.com/og.png</url><link>https://errorzap.com/og.png</link></image><generator>Hugo</generator><language>en-US</language><copyright>ErrorZap</copyright><lastBuildDate>Fri, 14 Aug 2026 23:14:18 -0600</lastBuildDate><atom:link href="https://errorzap.com/categories/field-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>8 GB Price, 16 GB Prize: My UNVR G2 Shipped With Double RAM</title><link>https://errorzap.com/posts/8-gb-price-16-gb-prize/</link><pubDate>Fri, 14 Aug 2026 23:14:18 -0600</pubDate><guid>https://errorzap.com/posts/8-gb-price-16-gb-prize/</guid><description>Ubiquiti advertises the UNVR G2 with 8 GB of memory. Mine identifies as a G2, reports 15.5 GB, and is actively using more than seven. Thanks for the accidental upgrade.</description><content:encoded><![CDATA[<p>Ubiquiti has a reputation for charging enough for memory upgrades that RAM starts to feel less like a component and more like a luxury tax.</p>
<p>So naturally, my new UNVR G2 appears to have refunded that tax in silicon.</p>
<p>The official specification says <strong>8 GB</strong>. The live console identifies the machine as a <strong>UNVR G2</strong> and reports <strong>7.43 GB used out of 15.5 GB</strong>.</p>
<p>Eight-gigabyte price. Sixteen-gigabyte prize.</p>
<p><img alt="A cartoon UNVR G2 celebrates an 8 GB price and a 16 GB prize." loading="lazy" src="/posts/8-gb-price-16-gb-prize/hero.png"></p>
<h2 id="paid-for-8-gb-found-155-gb">Paid for 8 GB. Found 15.5 GB.</h2>
<p>This started with a rumor: some early UNVR G2 units may have shipped with twice the advertised memory.</p>
<p>Mine looked suspicious immediately. UniFi OS showed 16 GB in About, which is fun—but an About screen can be wrong. A mislabeled model or cosmetic reporting bug would make a good screenshot and a terrible conclusion.</p>
<p>So I checked the live console details.</p>
<p>The machine reported:</p>
<ul>
<li><strong>Model:</strong> UNVR G2</li>
<li><strong>Processor:</strong> ARM 64-bit, 8 cores</li>
<li><strong>Memory:</strong> 7.43 GB / 15.5 GB at capture time</li>
<li><strong>UniFi OS:</strong> 5.1.25</li>
</ul>
<p>That memory line matters twice. It reports the 15.5 GB operating-system-visible total expected from a 16 GB device, and it shows more than seven gigabytes currently in use. This is not merely a decorative “16 GB” label sitting on an About page. The operating system has the capacity available and is using it.</p>
<p><img alt="Redacted live About This Console capture showing the UNVR G2 model, eight-core processor, and 7.43 GB used out of 15.5 GB." loading="lazy" src="/posts/8-gb-price-16-gb-prize/console-about-redacted.png"></p>
<h2 id="the-official-specification-makes-it-funnier">The official specification makes it funnier</h2>
<p>Ubiquiti&rsquo;s own specification page lists the standard <strong>Network Video Recorder G2</strong> with:</p>
<ul>
<li>Qualcomm Kryo CPU built on Arm Cortex technology</li>
<li>One 3.2 GHz prime core</li>
<li>Four 2.8 GHz performance cores</li>
<li>Three 2.0 GHz efficiency cores</li>
<li><strong>8 GB memory</strong></li>
</ul>
<p><img alt="Ubiquiti&rsquo;s official UNVR G2 hardware specification showing the Qualcomm processor and 8 GB of memory." loading="lazy" src="/posts/8-gb-price-16-gb-prize/g2-official-8gb.png"></p>
<p>The <strong>Network Video Recorder G2 Pro</strong> page lists the same processor description and <strong>16 GB memory</strong>.</p>
<p><img alt="Ubiquiti&rsquo;s official UNVR G2 Pro hardware specification showing the same Qualcomm processor description and 16 GB of memory." loading="lazy" src="/posts/8-gb-price-16-gb-prize/g2-pro-official-16gb.png"></p>
<p>That makes the accidental configuration delightfully specific: my standard G2 reports the Pro&rsquo;s memory capacity while still identifying itself as a standard G2.</p>
<h2 id="does-that-mean-it-is-secretly-a-g2-pro-board">Does that mean it is secretly a G2 Pro board?</h2>
<p>Not necessarily.</p>
<p>The CPU platform matches. Both official product pages describe the same eight-core Qualcomm Kryo configuration, and the live G2 reports eight ARM64 cores.</p>
<p>That does <strong>not</strong> prove the two products use an identical populated PCB. Model configuration, board revision, drive backplane, power system, I/O, and other components can differ even when the processor platform and memory capacity match.</p>
<p>The honest conclusion is narrower:</p>
<blockquote>
<p>This UNVR G2 has the advertised G2 identity, the G2 Pro&rsquo;s 16 GB-class memory capacity, and the same advertised CPU configuration as the G2 Pro.</p>
</blockquote>
<p>A teardown showing matching board markings would be stronger proof of a shared physical board. Until then, “same CPU platform” is verified; “secret G2 Pro motherboard” is a very entertaining hypothesis.</p>
<h2 id="how-to-check-your-own-unvr-g2">How to check your own UNVR G2</h2>
<p>You do not need to open the chassis.</p>
<ol>
<li>Sign in to the console&rsquo;s local UniFi OS interface.</li>
<li>Open <strong>Settings</strong>.</li>
<li>Select <strong>Console</strong>.</li>
<li>Click <strong>About This Console</strong>.</li>
<li>Read the <strong>Model</strong>, <strong>Processor</strong>, and <strong>Memory</strong> rows.</li>
</ol>
<p>An ordinary unit should follow Ubiquiti&rsquo;s published 8 GB specification. If yours reports approximately <strong>15.5 GB total</strong>, take a screenshot before a firmware update, inventory change, or support conversation turns it into folklore.</p>
<h2 id="thanks-ubiquiti">Thanks, Ubiquiti</h2>
<p>I am not complaining.</p>
<p>The box is correctly identifying itself as a UNVR G2. The extra memory is visible. The workload is using it. The official price sheet says I was supposed to receive eight.</p>
<p>For once, the memory surcharge paid dividends.</p>
<p>Thanks for the double, Ubiquiti.</p>
<hr>
<p><em>Scope note: This documents one verified unit. It is not a vendor-confirmed specification change, a guarantee about other production units, or proof that every early UNVR G2 received the same hardware.</em></p>
]]></content:encoded></item><item><title>I Put One Disposable IP on the Internet. Five Hours Later, Mirai Showed Up.</title><link>https://errorzap.com/posts/one-disposable-ip-five-hours-honeypot/</link><pubDate>Mon, 10 Aug 2026 00:00:00 -0600</pubDate><guid>https://errorzap.com/posts/one-disposable-ip-five-hours-honeypot/</guid><description>What an isolated interactive honeypot recorded during its first five hours on a fresh public IP.</description><content:encoded><![CDATA[<p>I put a brand-new public IP on the internet and made it look interesting.</p>
<p>Not <em>actually</em> interesting. The server held no customer information, useful credentials, production software, or access to anything I operate. It was a dedicated throwaway cloud VM on a disposable network, surrounded by controls intended to keep whatever arrived from going anywhere else.</p>
<p>But from the outside, it looked like a target.</p>
<p>Then I waited.</p>
<p>After roughly five hours, the honeypot had recorded <strong>191 sessions, 4,535 events, and 2,322 commands</strong>. Bots reached 90 simulated successful logins. They generated 146 malware download events, attempted to use the SSH service as a tunnel, and delivered two files independently detected as Mirai variants.</p>
<p>Nothing escaped. No new outbound connection succeeded.</p>
<p><img alt="Dark security infographic summarizing the first five hours: 191 sessions, 4,535 Cowrie events, 2,322 commands, 90 simulated logins, 146 download events, two Mirai variants, and zero outbound connections." loading="lazy" src="/posts/one-disposable-ip-five-hours-honeypot/five-hour-overview.png"></p>
<h2 id="the-five-hour-scoreboard">The five-hour scoreboard</h2>
<p>The interactive SSH honeypot accounted for the richest activity, but it was not the only service being tested. The surrounding simulations recorded another <strong>1,049 probes</strong>:</p>
<table>
	<thead>
			<tr>
					<th>Simulated service</th>
					<th style="text-align: right">Probes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>MySQL</td>
					<td style="text-align: right">995</td>
			</tr>
			<tr>
					<td>HTTP</td>
					<td style="text-align: right">30</td>
			</tr>
			<tr>
					<td>Redis</td>
					<td style="text-align: right">13</td>
			</tr>
			<tr>
					<td>FTP</td>
					<td style="text-align: right">6</td>
			</tr>
			<tr>
					<td>Other</td>
					<td style="text-align: right">5</td>
			</tr>
	</tbody>
</table>
<p>About 95 percent of that traffic targeted the fake MySQL service. The imbalance is a useful reminder that opportunistic scanning is not evenly distributed; automated campaigns concentrate on whatever their current playbook expects to monetize.</p>
<p><img alt="Service attack mix showing 1,049 probes: 995 MySQL, 30 HTTP, 13 Redis, six FTP, and five other events." loading="lazy" src="/posts/one-disposable-ip-five-hours-honeypot/service-attack-mix.png"></p>
<h2 id="they-did-not-stop-at-the-login-prompt">They did not stop at the login prompt</h2>
<p>A simple port scan is background noise. The revealing part began after the honeypot pretended to accept credentials.</p>
<p>The most active session issued <strong>297 commands</strong>. Rather than downloading one ready-made executable, the bot used hundreds of shell commands to assemble multi-architecture payload data byte by byte inside the simulated filesystem. It then attempted to mark the result executable and launch it.</p>
<p>That is a lot of work for a machine that never existed in the form the attacker imagined.</p>
<p>Another campaign tested writable locations and tried several delivery methods: HTTP, TFTP, and FTP. One captured shell script inspected <code>/proc</code> and killed processes whose executables were marked <code>(deleted)</code>. That behavior is consistent with malware cleaning up stale processes or removing competing infections before taking over the host.</p>
<p>Across the run, the system recorded <strong>75 captured download events and 71 failed attempts</strong>.</p>
<p><img alt="Bot playbook infographic showing 297 commands in one session, payload delivery over HTTP, TFTP, and FTP, two Mirai variants, an SSH tunnel attempt, and zero escapes." loading="lazy" src="/posts/one-disposable-ip-five-hours-honeypot/bot-playbook.png"></p>
<h2 id="mirai-is-still-very-much-alive">Mirai is still very much alive</h2>
<p>Two captured artifacts were independently identified by Microsoft Defender as:</p>
<ul>
<li><code>Backdoor:Linux/Mirai.FX!MTB</code></li>
<li><code>Backdoor:Linux/Mirai.GZ!MTB</code></li>
</ul>
<p>Neither payload executed. Extracted inspection copies were quarantined, while the original evidence was retained separately for later analysis.</p>
<p>The credential spray around these sessions was heavily focused on routers, cameras, optical network terminals, and other embedded devices. Generic <code>admin/admin</code> appeared most often, surrounded by vendor-style default credentials that have been circulating in botnet dictionaries for years.</p>
<p>The internet keeps inventing new technology. Its malware, apparently, enjoys the classics.</p>
<h2 id="the-weirdest-request-make-my-fake-server-a-proxy">The weirdest request: make my fake server a proxy</h2>
<p>One visitor attempted to use the simulated SSH service as a tunnel to <code>dns.google</code> over TLS. The honeypot recorded the forwarding request and its TLS fingerprint, then discarded the forwarded traffic.</p>
<p>That attempt matters because it shows a goal beyond simply infecting the host. A compromised SSH server can also become infrastructure: a proxy, a relay, a place to conceal the origin of the next connection, or a stepping stone toward another target.</p>
<p>The fake server played along just far enough to reveal the intention. It never provided the tunnel.</p>
<h2 id="the-containment-mattered-more-than-the-bait">The containment mattered more than the bait</h2>
<p>This was not attached to my home network, business environment, or a customer system. It used a fresh public IP and a dedicated disposable VM with no agents, tunnels, trusted keys, reusable credentials, or links to other services.</p>
<p>The exposed services were simulations. Forwarding and new outbound connections were blocked. The system could record what an attacker tried without giving that attacker a useful machine to operate.</p>
<p>That boundary is the difference between observing hostile behavior and accidentally donating infrastructure to it.</p>
<h2 id="what-five-hours-taught-me">What five hours taught me</h2>
<p>The surprise was not that attackers eventually found an exposed server. The surprise was how quickly the activity progressed from broad probing to simulated logins, malware delivery, process cleanup, multi-architecture payload assembly, and attempted tunneling.</p>
<p>Nobody was sitting at a keyboard admiring the target. Most of this was automated infrastructure working through an old, efficient routine:</p>
<ol>
<li>Find something exposed.</li>
<li>Try default credentials.</li>
<li>Determine what tools and writable paths exist.</li>
<li>Deliver a payload using whatever protocol works.</li>
<li>Remove competition.</li>
<li>Turn the host into part of something larger.</li>
</ol>
<p>One disposable IP was enough to watch the whole playbook unfold.</p>
<p>The internet does not knock politely. It starts trying <code>admin/admin</code> immediately.</p>
]]></content:encoded></item></channel></rss>