<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel J</title>
    <description>The latest articles on DEV Community by Daniel J (@tuxxin).</description>
    <link>https://dev.to/tuxxin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4055668%2F2923f58e-fe2b-49e8-a07e-3aeb8c4bf8b2.gif</url>
      <title>DEV Community: Daniel J</title>
      <link>https://dev.to/tuxxin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tuxxin"/>
    <language>en</language>
    <item>
      <title>Are stereograms bad for your eyes? What the evidence says</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:03:30 +0000</pubDate>
      <link>https://dev.to/tuxxin/are-stereograms-bad-for-your-eyes-what-the-evidence-says-4d1m</link>
      <guid>https://dev.to/tuxxin/are-stereograms-bad-for-your-eyes-what-the-evidence-says-4d1m</guid>
      <description>&lt;p&gt;Stereograms, often called Magic Eye pictures (the name is a trademark of Magic Eye Inc., which has no affiliation with The Week Eye), hide a 3D word or shape inside a flat pattern. Every &lt;a href="https://theweekeye.com/" rel="noopener noreferrer"&gt;weekly hidden 3D puzzle on The Week Eye&lt;/a&gt; is one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are stereograms bad for your eyes?
&lt;/h2&gt;

&lt;p&gt;Stereograms are bad for your eyes only in the short term: they can cause eye strain, headaches or blurred vision, and no published study has found lasting harm. The strain comes from holding your eyes in an unusual position, and it belongs to the same family as the strain from long reading or screen work.&lt;/p&gt;

&lt;p&gt;The American Academy of Ophthalmology (AAO) &lt;a href="https://www.aao.org/eye-health/tips-prevention/computer-usage" rel="noopener noreferrer"&gt;groups screen eye strain with the strain from reading and other close work&lt;/a&gt;, and it calls the belief that screens permanently damage your eyes untrue. Symptoms it lists include blurred vision and eyes that feel achy, dry or stinging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why stereograms can make your eyes hurt
&lt;/h2&gt;

&lt;p&gt;Stereograms make your eyes hurt because they pull apart two actions your eyes normally perform together: aiming and focusing.&lt;/p&gt;

&lt;p&gt;When you look at a real object, both eyes turn to point at it (vergence) and the lens in each eye changes shape to bring it into focus (accommodation). The two responses are coupled, so a change in one drives the other, as &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC2879326" rel="noopener noreferrer"&gt;Hoffman, Girshick, Akeley and Banks explain in the Journal of Vision (2008)&lt;/a&gt;. A stereogram breaks that link. Your eyes aim at a point behind the screen to fuse the pattern, while focus has to stay on the screen surface or the dots blur. &lt;a href="https://pubmed.ncbi.nlm.nih.gov/23094462/" rel="noopener noreferrer"&gt;Cisarik and colleagues (Perception, 2012)&lt;/a&gt; describe this split as the requirement for seeing an autostereogram. The guide to &lt;a href="https://theweekeye.com/guides/how-stereograms-work" rel="noopener noreferrer"&gt;how stereograms encode depth in a repeating pattern&lt;/a&gt; covers the image side.&lt;/p&gt;

&lt;p&gt;Researchers call this split vergence-accommodation conflict. Hoffman's team tested it on a 3D display: eye-related fatigue and discomfort scores were worse when the aiming and focus distances differed than when they matched, while neck and back symptoms did not differ. Their display used stereo images rather than a single printed pattern, but it imposed the same mismatch on the eyes.&lt;/p&gt;

&lt;p&gt;Screens add a second strain. The AAO reports that people blink only about 5 to 7 times a minute while using a screen, which dries the eye surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4oif44zpudafrws0j6r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4oif44zpudafrws0j6r.webp" alt="Practice stereogram from The Week Eye lessons. Viewed in 3D, a large square floats in front of the dot pattern." width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Relax your eyes and look through the screen, as if at something far behind it, until a large square floats out of the pattern.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Can stereograms damage your eyes?
&lt;/h2&gt;

&lt;p&gt;No published study reports lasting eye damage from stereograms. A PubMed search run for this article on November 2, 2026 returned no paper that measured damage, fatigue or other adverse effects from autostereograms, and the six papers indexed under "autostereogram" cover their history, their image design and the visual skills needed to see them.&lt;/p&gt;

&lt;p&gt;The closest evidence comes from convergence exercises, which train the same eye-aiming system on purpose. Across 12 trials with 1,289 people, the &lt;a href="https://www.cochrane.org/evidence/CD006768_how-do-different-treatments-vision-disorder-convergence-insufficiency-compare-effectiveness" rel="noopener noreferrer"&gt;Cochrane review of convergence insufficiency treatments&lt;/a&gt; found that no study, in children or adults, reported adverse effects from the treatments. Those trials tested clinical exercises, so they leave hidden 3D pictures themselves unstudied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are stereograms good for your eyes or brain?
&lt;/h2&gt;

&lt;p&gt;No published trial shows that viewing stereograms makes healthy eyes or brains work better. Stereogram skill does track how well your two eyes work together.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC2579958" rel="noopener noreferrer"&gt;a 2008 study of 194 people by Wilmer and Backus&lt;/a&gt;, those who said they were poor at seeing stereograms had a five-fold higher risk of impaired stereo vision on a standard clinical test. &lt;a href="https://pubmed.ncbi.nlm.nih.gov/22023025/" rel="noopener noreferrer"&gt;A 2012 study of 69 people&lt;/a&gt; linked the time it took to see a hidden shape to stereo acuity and convergence measures. Its authors wrote that it is uncertain whether stereograms are useful in clinical practice.&lt;/p&gt;

&lt;p&gt;Practice can change depth perception under lab conditions. &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC3174650" rel="noopener noreferrer"&gt;Ding and Levi (PNAS, 2011)&lt;/a&gt; trained five adults with strabismus or amblyopia whose stereo vision was absent or weak, and after thousands of training trials with stereoscopic gratings they recovered some stereo vision. That protocol used controlled sine-wave stimuli in a lab. The same PubMed search found no trial of stereograms as a memory, attention or brain-training exercise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can hidden 3D pictures improve your vision?
&lt;/h2&gt;

&lt;p&gt;No peer-reviewed study supports the claim that hidden 3D pictures improve vision. The claim appears in book marketing.&lt;/p&gt;

&lt;p&gt;The sixth book in that trademarked series, &lt;a href="https://publishing.andrewsmcmeel.com/?p=296" rel="noopener noreferrer"&gt;Beyond 3D: Improve Your Vision&lt;/a&gt; (2004), co-written with Marc Grossman, says it "helps promote healthy vision" and lists benefits that "may result." The publisher's description cites no studies for them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim in the book description&lt;/th&gt;
&lt;th&gt;What published research shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Improved overall vision&lt;/td&gt;
&lt;td&gt;No trial found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced computer eyestrain&lt;/td&gt;
&lt;td&gt;The aiming-focus mismatch increased eye fatigue in Hoffman et al. (2008)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lower stress&lt;/td&gt;
&lt;td&gt;No trial found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Longer attention span&lt;/td&gt;
&lt;td&gt;No trial found&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Stereogram eye exercises are convergence cards
&lt;/h2&gt;

&lt;p&gt;The stereogram eye exercises that eye clinics prescribe are printed convergence cards for convergence insufficiency, a condition in which the eyes drift outward and struggle to work together for close viewing.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.evelinalondon.nhs.uk/resources/patient-information/understanding-stereograms.pdf" rel="noopener noreferrer"&gt;Evelina London (NHS) stereogram leaflet&lt;/a&gt; describes a card printed with two incomplete cat pictures. The patient holds it at arm's length, follows a pen tip toward the face, and merges the cats into one complete cat. An orthoptist explains and demonstrates the exercise first. A random-dot hidden 3D picture hides a shape in a repeating texture and comes with no treatment plan.&lt;/p&gt;

&lt;p&gt;The Cochrane review (evidence current to September 2019) found high-certainty evidence that, in children, office-based therapy with home reinforcement worked better than placebo, home pencil push-ups and home computer therapy. In adults the results were less clear, and symptom changes showed no difference between treatments.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to view stereograms comfortably
&lt;/h2&gt;

&lt;p&gt;View stereograms in short sessions, at a normal screen distance, with relaxed parallel viewing, and stop if anything hurts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take breaks. Between attempts, look at an object in the distance for a while, as the AAO advises for screen work.&lt;/li&gt;
&lt;li&gt;Sit about 25 inches, roughly arm's length, from a desktop screen, the distance the AAO recommends. The &lt;a href="https://theweekeye.com/how-to-see-it" rel="noopener noreferrer"&gt;free step-by-step viewing lessons&lt;/a&gt; start with your face close to the screen and have you lean back slowly while holding a relaxed focus.&lt;/li&gt;
&lt;li&gt;Use parallel viewing. Every puzzle here is made for it: your eyes relax as if looking into the distance. Crossing your eyes reverses the depth and can feel harder to hold, as the &lt;a href="https://theweekeye.com/guides/parallel-vs-cross-eyed" rel="noopener noreferrer"&gt;parallel vs cross-eyed viewing guide&lt;/a&gt; explains.&lt;/li&gt;
&lt;li&gt;Keep your normal glasses on and cut glare by dimming room lights or tilting the screen.&lt;/li&gt;
&lt;li&gt;Stop at pain or double vision, and rest until your eyes feel normal.&lt;/li&gt;
&lt;li&gt;Keep sittings short. &lt;a href="https://theweekeye.com/eye-trials" rel="noopener noreferrer"&gt;Eye Trials allows one guess a day&lt;/a&gt;, so each session lasts one attempt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to see an eye doctor
&lt;/h2&gt;

&lt;p&gt;See an eye doctor if double vision or headaches continue after you stop viewing, or if a child cannot see any stereogram after practice. The AAO advises speaking with an ophthalmologist about any unusual vision symptoms.&lt;/p&gt;

&lt;p&gt;About 7% of adults under 60 lack stereo vision, according to &lt;a href="https://archive-ouverte.unige.ch/unige:116359" rel="noopener noreferrer"&gt;a 2019 evidence synthesis by Chopin, Bavelier and Levi&lt;/a&gt;, and the Wilmer and Backus study found that poor stereogram skill predicts impaired stereo vision. In a child, weak stereo vision deserves an exam because &lt;a href="https://www.aao.org/eye-health/diseases/amblyopia-lazy-eye" rel="noopener noreferrer"&gt;amblyopia, or lazy eye&lt;/a&gt;, responds best to early care: the AAO says it should be treated before age 7 or 8 for best results, and a child may not know one eye sees better than the other.&lt;/p&gt;

&lt;p&gt;Before booking, work through &lt;a href="https://theweekeye.com/guides/why-cant-i-see-stereograms" rel="noopener noreferrer"&gt;the common reasons people cannot see stereograms&lt;/a&gt;. Browser zoom, focusing on the screen and crossed eyes come first, and stereo blindness is the last item.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is it bad to look at stereograms every day?
&lt;/h3&gt;

&lt;p&gt;No study has tested daily stereogram viewing. Take the breaks the AAO recommends for close work, and stop whenever your eyes hurt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are stereograms safe for children?
&lt;/h3&gt;

&lt;p&gt;No study has found harm to children from stereograms. Use the same limits as for adults, and book an eye exam for a child who reports double vision or cannot see any hidden picture after practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Magic Eye improve vision?
&lt;/h3&gt;

&lt;p&gt;No controlled study shows that stereogram books improve vision. The vision claims in those books come from their authors and publishers, without cited trials.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I do stereogram eye exercises at home instead of seeing an orthoptist?
&lt;/h3&gt;

&lt;p&gt;Home exercise alone performed worse in children in the Cochrane review: office-based therapy with home reinforcement beat home pencil push-ups and home computer therapy. Get convergence exercises from an orthoptist or eye doctor, who also checks the diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should a stereogram session last?
&lt;/h3&gt;

&lt;p&gt;No study sets a safe length. Stop at the first ache, blur or double vision; &lt;a href="https://theweekeye.com/" rel="noopener noreferrer"&gt;this week's puzzle&lt;/a&gt; needs one correct look, and the timer stops when you type the answer.&lt;/p&gt;

</description>
      <category>stereograms</category>
      <category>eyehealth</category>
      <category>eyestrain</category>
      <category>hidden3dpictures</category>
    </item>
    <item>
      <title>crt.sh alternatives: certificate transparency search tools compared</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Sun, 01 Nov 2026 16:17:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/crtsh-alternatives-certificate-transparency-search-tools-compared-4ij5</link>
      <guid>https://dev.to/tuxxin/crtsh-alternatives-certificate-transparency-search-tools-compared-4ij5</guid>
      <description>&lt;p&gt;crt.sh is the best-known free certificate transparency search, and it has returned 502 errors and slow searches for most of 2026. The tool to use instead depends on the question:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Older certificates for a domain, free&lt;/td&gt;
&lt;td&gt;crt.sh, when it answers&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Current certificates for a domain, by API, free&lt;/td&gt;
&lt;td&gt;SSLMate Cert Spotter&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Subdomains of a domain, with typo-matching search&lt;/td&gt;
&lt;td&gt;Merklemap&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Which hosts serve a certificate right now&lt;/td&gt;
&lt;td&gt;Censys or Shodan&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Certificates issued in the last day, with the domain's DNS, address and registration&lt;/td&gt;
&lt;td&gt;issued.live&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Domains hosted on an IP address or range, and the certificates issued for them&lt;/td&gt;
&lt;td&gt;issued.live (paid plans)&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;issued.live is this site, and we run it. Prices and free limits below come from each vendor's own pages, checked on 31 October 2026. Where a vendor publishes no price, the table says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  crt.sh in 2026: 502 errors and a rebuild
&lt;/h2&gt;

&lt;p&gt;crt.sh is run by Sectigo. It needs no account and charges nothing. It searches by name, by SHA-1 or SHA-256 fingerprint and by crt.sh ID, and its advanced search adds CN, SAN, serial and key-ID searches, an option to hide expired certificates, precertificate de-duplication and certificate linting.&lt;/p&gt;

&lt;p&gt;The service has struggled through 2026. Users reported 502 errors on the crt.sh mailing list in March, port 5432 timeouts in April, and in May a thread titled with "502 errors for almost a month". On 28 May 2026 Sectigo wrote that it was "painfully aware that crt.sh:443 and crt.sh:5432 have been struggling for some time", put the cause on an indexing strategy that "has not aged well", and described a rebuild of the 68 TB database on PostgreSQL 15 with partitioning. No completion date was given. A user asked for an update on 11 October; the thread had no reply on 31 October.&lt;/p&gt;

&lt;p&gt;Our own tests on 1 November 2026, around 01:20 UTC: of four JSON requests (&lt;code&gt;?output=json&lt;/code&gt;), three returned HTTP 502 and one returned after six seconds, and plain HTML searches took 21 to 29 seconds. Five minutes later, none of six requests succeeded. A JSON search for github.com timed out after 60 seconds with no data, and the other five returned HTTP 502 within half a second, including the page for a single certificate (&lt;code&gt;?id=1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;When crt.sh does answer, three habits keep queries small: tick "Exclude expired" in the advanced search, de-duplicate precertificates, and search one exact name before a &lt;code&gt;%&lt;/code&gt; wildcard. Sectigo also names &lt;code&gt;crt.sh:5432&lt;/code&gt; as a public PostgreSQL endpoint for direct SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate transparency search tools that no longer exist
&lt;/h2&gt;

&lt;p&gt;Older "crt.sh alternative" lists still recommend tools that have closed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Transparency Report certificate search:&lt;/strong&gt; discontinued in May 2022, per Google's own changelog for the report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meta (Facebook) Certificate Transparency Monitoring:&lt;/strong&gt; &lt;code&gt;developers.facebook.com/tools/ct/&lt;/code&gt; and its documentation pages returned HTTP 404 on 31 October 2026. Meta has published no retirement date that we could find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrust CT search:&lt;/strong&gt; &lt;code&gt;ui.ctsearch.entrust.com&lt;/code&gt; no longer resolves. Entrust sold its public certificate business to Sectigo in January 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Merkle Town:&lt;/strong&gt; &lt;code&gt;ct.cloudflare.com&lt;/code&gt; now redirects to Cloudflare Radar's certificate transparency page, which shows issuance statistics and has no per-domain search.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SSLMate Cert Spotter
&lt;/h2&gt;

&lt;p&gt;Cert Spotter is the closest match to crt.sh for scripts. Its CT Search API takes a domain and returns its certificates as JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://api.certspotter.com/v1/issuances?domain=example.com&amp;amp;include_subdomains=true&amp;amp;expand=dns_names"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 100 single-hostname queries an hour and 10 full-domain queries an hour. SSLMate's documentation allows unauthenticated queries for personal and evaluation use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid:&lt;/strong&gt; CT Search API Medium $50 a month, Large $500 a month, and a full firehose at $1,000 a month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; from $15 a month (Hobbyist, 20 endpoints), with a 30-day trial. The open-source &lt;code&gt;certspotter&lt;/code&gt; monitor on GitHub runs on your own machine at no cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits:&lt;/strong&gt; the API returns unexpired certificates only, and searches by domain only. There is no search by IP address, public key or issuer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Censys
&lt;/h2&gt;

&lt;p&gt;Censys combines certificate data with internet-wide scans, so it answers which hosts present a certificate as well as which names it covers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 100 credits a month with an account. A search, a lookup, an extra results page or a filter each cost one credit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid:&lt;/strong&gt; no published price. Every paid tier is "Contact sales". Censys lists data history of 1+ month, 3+ months and 12+ months by tier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Merklemap
&lt;/h2&gt;

&lt;p&gt;Merklemap indexes certificate transparency for subdomain discovery. Its search supports wildcards and a Levenshtein "distance" mode that finds names a few characters away from the query, which suits lookalike-domain hunting. It also sells a live stream of newly seen hostnames.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; one plan at EUR 49 a month with 100,000 requests, covering the API and the website.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; the API requires the paid plan. Free website limits and history depth are not published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shodan
&lt;/h2&gt;

&lt;p&gt;Shodan sees certificates by scanning hosts and reading the certificate each one serves, and exposes them under &lt;code&gt;ssl.cert&lt;/code&gt; search filters. A certificate that was issued but never deployed on a scanned address does not appear, so Shodan shows where a certificate is in use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Membership is a one-time $49. API plans start at $69 a month (Freelancer), then $359 and $1,099.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  issued.live
&lt;/h2&gt;

&lt;p&gt;issued.live reads every public CT log continuously and joins each certificate to the domain's DNS from seven resolver vantage points, its hosting address and network, and its registration data from ICANN zone files. The free lookup needs no account or key and returns JSON to curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://issued.live/github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response carries the current certificate ID, issuer and expiry, the hosting address, registration and expiry dates, and when a certificate for the name was first seen in CT. The same URL returns Markdown with &lt;code&gt;.md&lt;/code&gt; appended, and a web page in a browser. Free use is 1,000 requests a day per address. &lt;code&gt;https://issued.live/api/feed&lt;/code&gt; streams certificates as they are logged, over a rolling 30-minute window, also without a key.&lt;/p&gt;

&lt;p&gt;Paid plans add search by address, certificate, key and name pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plus, $99 a month:&lt;/strong&gt; reverse IP and CIDR lookup (every domain hosted on an address or range), certificate lookup by ID or SHA-256 with its full SAN list, and every certificate sharing one public key (SPKI) among certificates first seen in the last 32 hours. How the range lookup works is in &lt;a href="https://issued.live/news/find-domains-in-ip-range" rel="noopener noreferrer"&gt;find domains in an IP range&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro, $199 a month:&lt;/strong&gt; pattern search across all registrable domains (&lt;code&gt;*agent.com&lt;/code&gt;, &lt;code&gt;loop-*.com&lt;/code&gt;), batch lookup of 500 domains in one call, the newly registered domains feed, and every certificate issued for the hostnames seen on one IP address.&lt;/li&gt;
&lt;li&gt;Every keyed endpoint is also a tool on the issued.live MCP server at &lt;code&gt;https://issued.live/mcp&lt;/code&gt;, on the same plan, for AI assistants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Domains hosted on an IP address
&lt;/h2&gt;

&lt;p&gt;Threat researchers pivot from one domain to its server, then from the server to every other domain hosted there. A certificate records the names it covers and nothing about where they are hosted, so crt.sh, Cert Spotter and Merklemap have no IP search.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Censys and Shodan&lt;/strong&gt; scan IP addresses and show what each one serves at scan time, including the names on the certificate it presents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issued.live&lt;/strong&gt; resolves every name it sees in CT logs and zone files from its own resolvers and keeps each address a name answered with, with no expiry. The reverse IP lookup on Plus returns every domain hosted on an address, with first-seen and last-seen dates. Observations begin in August 2026.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://issued.live/api/v1/ip/185.199.108.133 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;first_seen_from&lt;/code&gt; and &lt;code&gt;first_seen_to&lt;/code&gt; restrict the list to domains first seen on the address inside a time window, such as the names that moved onto a server this week. &lt;code&gt;/api/v1/range/{cidr}&lt;/code&gt; runs the same lookup across up to 256 addresses, covered in &lt;a href="https://issued.live/news/find-domains-in-ip-range" rel="noopener noreferrer"&gt;find domains in an IP range&lt;/a&gt;. On Pro, &lt;code&gt;/api/v1/ip/{ip}/certs&lt;/code&gt; returns every certificate issued for the hostnames seen on the address, in issuance order.&lt;/p&gt;

&lt;h2&gt;
  
  
  SSL certificate history for a domain
&lt;/h2&gt;

&lt;p&gt;Certificate history is where the tools differ most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;crt.sh&lt;/strong&gt; holds the largest dataset of the free tools, a 68 TB database by Sectigo's count, subject to the availability problems above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cert Spotter&lt;/strong&gt; returns unexpired certificates only, so it shows what is valid today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Censys&lt;/strong&gt; keeps 1 to 12+ months of data depending on the paid tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issued.live&lt;/strong&gt; keeps certificates queryable for 32 hours. Pro searches the permanent archive from 9 September 2026 onward, and the daily certificate files are archived permanently from 17 September 2026. For a domain's certificates from before September 2026, use crt.sh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prices and free limits
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Paid from&lt;/th&gt;
&lt;th&gt;Search by&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;crt.sh&lt;/td&gt;
&lt;td&gt;No account; no published rate limit&lt;/td&gt;
&lt;td&gt;No paid tier&lt;/td&gt;
&lt;td&gt;Name, fingerprint, ID, CN, SAN, serial, key ID&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Cert Spotter&lt;/td&gt;
&lt;td&gt;100 hostname queries/hour, 10 full-domain/hour&lt;/td&gt;
&lt;td&gt;$50/month (API), $15/month (monitoring)&lt;/td&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Censys&lt;/td&gt;
&lt;td&gt;100 credits/month, account required&lt;/td&gt;
&lt;td&gt;Not published&lt;/td&gt;
&lt;td&gt;Certificates, hosts&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Merklemap&lt;/td&gt;
&lt;td&gt;Website only; limits not published&lt;/td&gt;
&lt;td&gt;EUR 49/month&lt;/td&gt;
&lt;td&gt;Domain, wildcard, edit distance&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Shodan&lt;/td&gt;
&lt;td&gt;Account; filter access not documented&lt;/td&gt;
&lt;td&gt;$49 once, API $69/month&lt;/td&gt;
&lt;td&gt;Hosts, certificate fields&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;issued.live&lt;/td&gt;
&lt;td&gt;1,000 requests/day, no account&lt;/td&gt;
&lt;td&gt;$39/month; searches from $99/month&lt;/td&gt;
&lt;td&gt;Domain, IP, CIDR, certificate, public key, name pattern&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: &lt;a href="https://crt.sh/" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt;, the &lt;a href="https://groups.google.com/g/crtsh" rel="noopener noreferrer"&gt;crt.sh mailing list&lt;/a&gt;, &lt;a href="https://sslmate.com/ct_search_api/" rel="noopener noreferrer"&gt;SSLMate CT Search API&lt;/a&gt;, &lt;a href="https://sslmate.com/certspotter/pricing" rel="noopener noreferrer"&gt;Cert Spotter pricing&lt;/a&gt;, &lt;a href="https://docs.censys.com/docs/platform-credits-free-starter" rel="noopener noreferrer"&gt;Censys free credits&lt;/a&gt;, &lt;a href="https://censys.com/pricing" rel="noopener noreferrer"&gt;Censys pricing&lt;/a&gt;, &lt;a href="https://www.merklemap.com/pricing" rel="noopener noreferrer"&gt;Merklemap pricing&lt;/a&gt;, &lt;a href="https://book.shodan.io/getting-started/platform/" rel="noopener noreferrer"&gt;Shodan plans&lt;/a&gt;, &lt;a href="https://support.google.com/transparencyreport/answer/7381671" rel="noopener noreferrer"&gt;Google Transparency Report changelog&lt;/a&gt;, and &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;issued.live pricing&lt;/a&gt;. Prices change; check the vendor before buying.&lt;/p&gt;

&lt;p&gt;For bulk domain lists and zone files, the &lt;a href="https://issued.live/compare" rel="noopener noreferrer"&gt;issued.live comparison page&lt;/a&gt; covers AllZonefiles.io, Domains-Monitor and WhoisXML API.&lt;/p&gt;

</description>
      <category>certificatetransparency</category>
      <category>osint</category>
      <category>threathunting</category>
      <category>domainshostedonip</category>
    </item>
    <item>
      <title>3D-printable QR duck tags for multi-color printers</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:23:16 +0000</pubDate>
      <link>https://dev.to/tuxxin/3d-printable-qr-duck-tags-for-multi-color-printers-15e</link>
      <guid>https://dev.to/tuxxin/3d-printable-qr-duck-tags-for-multi-color-printers-15e</guid>
      <description>&lt;p&gt;Every DuckyTrack duck can now get a 3D-printable QR tag. A Duckster asked for a way to build their duck's tag into the ducks they print, so we made a two-color model you download from your tag's page and print on a multi-color printer. Fresh off the build plate, it works like any DuckyTrack tag: scan it and the duck's journey opens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you download
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A 3MF model with two parts.&lt;/strong&gt; "Tag base" prints in light filament and "QR code" prints in dark filament. White and black scan best.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same two parts as STL files&lt;/strong&gt;, packed in a ZIP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two styles.&lt;/strong&gt; A hang tag with a keyring hole that fits a split ring or cord, or a square inlay to build into your own duck designs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three sizes: 30, 40 and 50 mm.&lt;/strong&gt; We recommend 40 mm for reliable scans.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Printers and slicers
&lt;/h2&gt;

&lt;p&gt;The model is made for multi-color printers, such as a Bambu Lab printer with an AMS, or a Prusa printer with an MMU or XL toolheads. It opens in Bambu Studio, OrcaSlicer and PrusaSlicer. If your slicer asks whether to load the file as a single object with multiple parts, choose Yes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it prints face-down
&lt;/h2&gt;

&lt;p&gt;The QR code is inlaid flush with the base and prints face-down on the build plate. Printing the code on the first layers gives it crisp edges and a matte finish that phone cameras read well. All the color changes happen in those first few layers, so the print is fast and purges little filament.&lt;/p&gt;

&lt;p&gt;Print the tag exactly as it is placed. Flip it over when it comes off the plate and the code reads correctly.&lt;/p&gt;

&lt;p&gt;Scan the printed tag with your phone before you release the duck. Scan it outside the DuckyTrack app and close the page without tapping "I found it!", so the test logs no find.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get yours
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create your duck's tag at &lt;a href="https://duckytrack.com/tags" rel="noopener noreferrer"&gt;/tags&lt;/a&gt;. Tags are still free.&lt;/li&gt;
&lt;li&gt;On that tag's download page, find the "3D-Printable Tag" card.&lt;/li&gt;
&lt;li&gt;Pick a style and a size, then tap "Download 3D Model (3MF)", or take the STL files in a ZIP.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 3D tag follows the same rules as our &lt;a href="https://duckytrack.com/qr-duck-tags" rel="noopener noreferrer"&gt;paper QR duck tags&lt;/a&gt;: only the duck's owner can download it, from the download page, within 72 hours of creating the duck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hatching next: printable ducks with your code built in
&lt;/h2&gt;

&lt;p&gt;The tag is step one. We're building a collection of 3D-printable duck designs with the owner's QR code already built in. Download one, drop it into your slicer, and print a finished duck that is ready to track.&lt;/p&gt;

&lt;p&gt;Designs in the works include pocket-size ducks made for hiding, tabletop display ducks for businesses and vacation rentals, and a few surprises. The collection launches as a beta first.&lt;/p&gt;

&lt;p&gt;Printer owners, send us the ducks you'd like to print through our &lt;a href="https://duckytrack.com/contact" rel="noopener noreferrer"&gt;contact page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>3dprinting</category>
      <category>rubberducks</category>
      <category>qrcodes</category>
      <category>siteupdates</category>
    </item>
    <item>
      <title>EtherSnake: a zero-detection MSI that hides its C2 on Ethereum</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Thu, 29 Oct 2026 22:20:43 +0000</pubDate>
      <link>https://dev.to/tuxxin/ethersnake-a-zero-detection-msi-that-hides-its-c2-on-ethereum-7dl</link>
      <guid>https://dev.to/tuxxin/ethersnake-a-zero-detection-msi-that-hides-its-c2-on-ethereum-7dl</guid>
      <description>&lt;p&gt;&lt;em&gt;Updated October 30, 2026: the analyzed samples are now on MalwareBazaar, and we added netpatch.msi, a possible earlier variant. The details are in the update near the end of this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;EtherSnake is a Windows installer that scored 0 detections on VirusTotal and installs a Python backdoor that reads its command-and-control (C2) address from an Ethereum smart contract. The operator has set that address seven times since deploying the contract on October 16, an initial value and six changes, and every infected machine follows each change. Snoopy Triage, Tuxxin's threat analysis platform, extracted every stage and decrypted the payload on October 29, 2026 without running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the sample surfaced
&lt;/h2&gt;

&lt;p&gt;On October 29, 2026, &lt;a href="https://x.com/malwrhunterteam/status/2115875870560694464" rel="noopener noreferrer"&gt;@malwrhunterteam posted the sample&lt;/a&gt;, served from Azure hosting at &lt;code&gt;hxxps://octoberfp.eastus.cloudapp.azure[.]com/files/KB59985&lt;/code&gt;. VirusTotal showed 0 detections, and its Code Insight summary said the MSI had "no active components, scripts, or installation routines". @smica83 uploaded it to &lt;a href="https://bazaar.abuse.ch/sample/a6ecbf30583cf4e81c67d13d1f8917e18ab75a149191a3e8628f522d45312be0/" rel="noopener noreferrer"&gt;MalwareBazaar&lt;/a&gt;. Snoopy Triage picked it up from a public feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The infection chain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The MSI
&lt;/h3&gt;

&lt;p&gt;The installer is 36 KB, built with WiX on October 28 at 14:45 UTC, with random product and manufacturer names. It unpacks four files into a random folder under &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DeployFinalize.cmd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a two-line VBS helper&lt;/li&gt;
&lt;li&gt;a Python loader&lt;/li&gt;
&lt;li&gt;an encrypted &lt;code&gt;.bin&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A deferred, asynchronous custom action runs &lt;code&gt;DeployFinalize.cmd&lt;/code&gt; after the install finishes. A hidden shortcut in the Startup folder runs it again at every logon.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. DeployFinalize.cmd
&lt;/h3&gt;

&lt;p&gt;The script is padded with fake corporate-deployment comments. It downloads the official embeddable Python 3.12.3 from python.org, with the URL stored in base64, and unpacks it with the Windows &lt;code&gt;tar.exe&lt;/code&gt;. It renames &lt;code&gt;pythonw.exe&lt;/code&gt; to &lt;code&gt;ConfigEngine.exe&lt;/code&gt; and starts it hidden through the VBS helper.&lt;/p&gt;

&lt;p&gt;Each file a scanner sees on its own is either legitimate software or meaningless data. That explains the zero detection score.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The loader
&lt;/h3&gt;

&lt;p&gt;The Python loader XORs the &lt;code&gt;.bin&lt;/code&gt; file with a 32-byte key and each byte's position, then passes the result to &lt;code&gt;exec()&lt;/code&gt;, so the decrypted backdoor runs in memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The backdoor
&lt;/h3&gt;

&lt;p&gt;The backdoor is written in Python and carries code paths for both Windows and Linux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It reads its C2 address from an Ethereum smart contract. It asks nine public RPC providers and takes the majority answer. The lookup key is the operator's wallet address.&lt;/li&gt;
&lt;li&gt;It polls &lt;code&gt;/api/&amp;lt;random&amp;gt;/&amp;lt;bot id&amp;gt;/&amp;lt;random&amp;gt;.png?id=&amp;lt;build id&amp;gt;&lt;/code&gt;, or the same path ending in .jpg, .gif, .css, .ico or .webp, and sends the header &lt;code&gt;X-Bot-Type: python&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It runs any Python code the server returns, with shell and socket access.&lt;/li&gt;
&lt;li&gt;It persists through a Startup file named &lt;code&gt;MicrosoftEdgeUpdate.cmd&lt;/code&gt; and a logon task named &lt;code&gt;MicrosoftEdgeUpdateTask&lt;/code&gt; followed by four hex characters.&lt;/li&gt;
&lt;li&gt;It disables TLS certificate checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The C2 lives on Ethereum
&lt;/h2&gt;

&lt;p&gt;The contract is &lt;code&gt;0x41179162599919ad4eadcabc2cfefc1133269c2c&lt;/code&gt; on Ethereum mainnet. The operator wallet, &lt;code&gt;0xeb7d120ea01d624e4fc8d3cf8e90595d55083d06&lt;/code&gt;, has 8 transactions: the contract deployment and 7 writes of the C2 address. The first write set the initial C2 three blocks after deployment, and the other 6 changed it.&lt;/p&gt;

&lt;p&gt;The operator can move the C2 at any moment with one transaction, and every bot follows. The same design gives defenders a full public record: every C2 the operator ever set is readable on-chain.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;UTC&lt;/th&gt;
&lt;th&gt;C2 written to the contract&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2026-10-16 20:37&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://zone-14-service-8-8.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initial value, just after deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2026-10-27 22:10&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://sigmauperdonesoft[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2026-10-28 06:54&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://zone-14-service-8-8.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2026-10-28 09:53&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://sigmauperdonesoft[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2026-10-28 10:04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://zone-14-service-8-8.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2026-10-28 10:57&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://westusserverfor.westus2.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2026-10-29 14:13&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hxxps://esastus-oct29.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sample also carries a built-in backup C2, &lt;code&gt;october28floor.eastus.cloudapp.azure[.]com&lt;/code&gt;. The last switch came about 4.5 hours before the public post.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sigmauperdonesoft[.]com&lt;/code&gt; was registered on October 27 and pointed at &lt;code&gt;172.233.158[.]8&lt;/code&gt; (Linode), with Cloudflare DNS. &lt;code&gt;softportalone[.]com&lt;/code&gt; was registered the same day and shares that IP. We found no evidence it served as a C2.&lt;/p&gt;

&lt;p&gt;Every host in this campaign was created by the attacker. No compromised websites are involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the name EtherSnake
&lt;/h2&gt;

&lt;p&gt;The design mirrors EtherRAT, a Node.js implant &lt;a href="https://www.sysdig.com/blog/etherrat-dprk-uses-novel-ethereum-implant-in-react2shell-attacks" rel="noopener noreferrer"&gt;Sysdig documented in December 2025&lt;/a&gt;: C2 stored on-chain, a majority vote across nine RPC providers, the wallet as the lookup key, and a download of an official language runtime. We found no shared code and make no attribution claim. "EtherSnake" names this Python implant only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators
&lt;/h2&gt;

&lt;p&gt;Cloud IPs get reassigned quickly, so the hostnames and hashes are the lasting indicators.&lt;/p&gt;

&lt;h3&gt;
  
  
  SHA256
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hash&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a6ecbf30583cf4e81c67d13d1f8917e18ab75a149191a3e8628f522d45312be0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MSI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3aaaa49a0c4b139a8098b27dba31235571f68b32d96e25669e7febe6c82976d9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DeployFinalize.cmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;61d6b309d9774d13d632322816260e082f96293087333e7a379310e7b0796be0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VBS helper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;905e2e48e90e0d4aa332e7c39e9d7a41407fdc5bc78bad14c46294ec5c08b784&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python loader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d79112cd7e8107719c63f901896f74154d5cf3d8aa20937c4ecb2f56ae28db46&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encrypted .bin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a0501b667a166efa07bfa4f376d24e97948c68661a13e37ce6a6029edcbee0aa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Decrypted backdoor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Hosts and IPs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;octoberfp.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;172.174.116[.]94&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Payload host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zone-14-service-8-8.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.246.227[.]107&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sigmauperdonesoft[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;172.233.158[.]8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;westusserverfor.westus2.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20.94.232[.]24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;esastus-oct29.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20.55.89[.]207&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2 (current)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;october28floor.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;172.174.235[.]40&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backup C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;softportalone[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;172.233.158[.]8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sibling domain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  On-chain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contract: &lt;code&gt;0x41179162599919ad4eadcabc2cfefc1133269c2c&lt;/code&gt; (Ethereum mainnet)&lt;/li&gt;
&lt;li&gt;Operator wallet: &lt;code&gt;0xeb7d120ea01d624e4fc8d3cf8e90595d55083d06&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Detection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pythonw.exe&lt;/code&gt;, or any process named &lt;code&gt;ConfigEngine.exe&lt;/code&gt;, connecting to public Ethereum RPC providers.&lt;/li&gt;
&lt;li&gt;The header &lt;code&gt;X-Bot-Type: python&lt;/code&gt; in proxy or web server logs.&lt;/li&gt;
&lt;li&gt;Logon tasks named &lt;code&gt;MicrosoftEdgeUpdateTask&lt;/code&gt; plus hex characters that point to a Python runtime under &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt;, and a Startup file named &lt;code&gt;MicrosoftEdgeUpdate.cmd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An MSI custom action that runs a &lt;code&gt;.cmd&lt;/code&gt; file from its own install folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On an infected host: isolate it, remove the logon task, the Startup files and the &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt; folder, and treat every credential used on that machine as exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update, October 30, 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Samples on MalwareBazaar
&lt;/h3&gt;

&lt;p&gt;The four files we analyzed are now public on MalwareBazaar with the tag EtherSnake, next to the MSI that @smica83 reported. The links are in the list at the end of this post. The decrypted backdoor is the payload decrypted from &lt;code&gt;Ac2cwRJF6zPS.bin&lt;/code&gt;; on a victim it only ever runs in memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  A possible earlier variant: netpatch.msi
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;netpatch.msi&lt;/code&gt; is a 32 KB WiX MSI with the product name "FactAuth", built on October 27, 2026. @smica83 posted it on &lt;a href="https://bazaar.abuse.ch/sample/acd083343625712a2116d2480cdf9e80af72338b7653590d03b109b60708742b/" rel="noopener noreferrer"&gt;MalwareBazaar&lt;/a&gt; on October 29, and @malwrhunterteam shared it the same day. It was hosted on Azure blob storage at &lt;code&gt;buildpoint.blob.core.windows[.]net/stackguard/netpatch.msi&lt;/code&gt;, and the file has since been removed.&lt;/p&gt;

&lt;p&gt;The link to EtherSnake rests on design overlap alone. The two share no wallet, server or code, so we call netpatch a possible earlier variant and nothing stronger.&lt;/p&gt;

&lt;h3&gt;
  
  
  How netpatch works
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A custom action runs &lt;code&gt;ins.cmd&lt;/code&gt;. It downloads the official embeddable Python 3.14.3 from python.org into a random nine-letter folder under &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt;, installs pip, and pip-installs &lt;code&gt;web3&lt;/code&gt;, &lt;code&gt;pywin32&lt;/code&gt;, &lt;code&gt;pythonnet&lt;/code&gt;, &lt;code&gt;pywinpty&lt;/code&gt; and &lt;code&gt;websockets&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_message.py&lt;/code&gt; uses web3 to call &lt;code&gt;getMessage()&lt;/code&gt; on an Ethereum Sepolia testnet contract, &lt;code&gt;0x86bdF9F8D5fD58C53018a7C797Bd50d4ca6C1A1f&lt;/code&gt;, and writes the answer, the C2 host, to &lt;code&gt;ML.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A one-line &lt;code&gt;pythonw.exe&lt;/code&gt; command, with its strings split apart, polls &lt;code&gt;https://&amp;lt;C2&amp;gt;/&amp;lt;6 random letters&amp;gt;/&amp;lt;9 random letters&amp;gt;?v=6&lt;/code&gt; with certificate checks off. It runs the Python code in the &lt;code&gt;c&lt;/code&gt; field of the JSON reply.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start.cmd&lt;/code&gt; repeats this at every logon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The contract's current C2 is &lt;code&gt;deployment.eastus.cloudapp.azure[.]com&lt;/code&gt; (&lt;code&gt;20.55.80[.]190&lt;/code&gt;), written on September 22, 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  netpatch on-chain history
&lt;/h3&gt;

&lt;p&gt;The deployer wallet, &lt;code&gt;0x378ba15a67666137D8158b4EfaBF71B3EAfdDeCB&lt;/code&gt;, was funded with test ETH on June 21, 2026. In June it built and tested a two-way message channel on Sepolia: a contract named &lt;code&gt;MessageQueue&lt;/code&gt; with &lt;code&gt;sendToServer&lt;/code&gt;, &lt;code&gt;sendToClient&lt;/code&gt; and &lt;code&gt;clearServerMessages&lt;/code&gt; calls.&lt;/p&gt;

&lt;p&gt;On September 20, 2026 the wallet deployed the netpatch contract and wrote "Hello from Python!" to it as a test. On September 22 it wrote the Azure C2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it may be related
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Both are small WiX MSIs.&lt;/li&gt;
&lt;li&gt;Both stage the official python.org embeddable runtime in a random &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Both read their C2 host from an Ethereum contract.&lt;/li&gt;
&lt;li&gt;Both use Azure East US cloudapp hosts for C2.&lt;/li&gt;
&lt;li&gt;Both run whatever Python the C2 returns, with TLS verification off.&lt;/li&gt;
&lt;li&gt;Both surfaced the same week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The netpatch contract predates EtherSnake's first contract, deployed October 16. netpatch looks like a simpler build: a testnet instead of mainnet, one RPC provider instead of a nine-provider vote, and no encrypted stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we can't show
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No wallet, server or code is shared with EtherSnake.&lt;/li&gt;
&lt;li&gt;The Sepolia wallets have never been used on mainnet, and the EtherSnake wallets have never been used on Sepolia.&lt;/li&gt;
&lt;li&gt;Blockchain-hosted C2 is common enough that a separate actor is possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  netpatch indicators
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;&lt;code&gt;acd083343625712a2116d2480cdf9e80af72338b7653590d03b109b60708742b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;netpatch.msi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;&lt;code&gt;64ac14cde7dc19a6f57ec14ddeb9f4404c559968472080a8bc5644dc067858b9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ins.cmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;&lt;code&gt;85b4a507984b89be7378a64affb762712b25544a00b18d0b187d7816519490a6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;start.cmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;&lt;code&gt;c0fdefe243f17f89b1b4b2dd93574b52b3509c87a80123209222a6724a77e047&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;get_message.py&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sepolia contract&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x86bdF9F8D5fD58C53018a7C797Bd50d4ca6C1A1f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;getMessage()&lt;/code&gt; returns the C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sepolia wallet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x378ba15a67666137D8158b4EfaBF71B3EAfdDeCB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployer and writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;buildpoint.blob.core.windows[.]net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Payload host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;deployment.eastus.cloudapp.azure[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2, &lt;code&gt;20.55.80[.]190&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Detecting netpatch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Endpoints that run pip or web3 from a Python folder under &lt;code&gt;%LOCALAPPDATA%&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A file named &lt;code&gt;ML.txt&lt;/code&gt; next to &lt;code&gt;pythonw.exe&lt;/code&gt; in that folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shared publicly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://otx.alienvault.com/pulse/6ae3bfb84d9eef27054f3fce" rel="noopener noreferrer"&gt;AlienVault OTX pulse&lt;/a&gt; with 33 indicators, including netpatch&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://urlhaus.abuse.ch/browse.php?search=octoberfp" rel="noopener noreferrer"&gt;URLhaus&lt;/a&gt;: the payload URL&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://threatfox.abuse.ch/browse.php?search=tag%3AEtherSnake" rel="noopener noreferrer"&gt;ThreatFox&lt;/a&gt;: 5 C2 hosts tagged EtherSnake&lt;/li&gt;
&lt;li&gt;MalwareBazaar, tagged EtherSnake:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bazaar.abuse.ch/sample/a6ecbf30583cf4e81c67d13d1f8917e18ab75a149191a3e8628f522d45312be0/" rel="noopener noreferrer"&gt;The MSI&lt;/a&gt;, reported by @smica83&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bazaar.abuse.ch/sample/3aaaa49a0c4b139a8098b27dba31235571f68b32d96e25669e7febe6c82976d9/" rel="noopener noreferrer"&gt;DeployFinalize.cmd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bazaar.abuse.ch/sample/61d6b309d9774d13d632322816260e082f96293087333e7a379310e7b0796be0/" rel="noopener noreferrer"&gt;run1w7zzg.vbs&lt;/a&gt;, the VBS helper&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bazaar.abuse.ch/sample/905e2e48e90e0d4aa332e7c39e9d7a41407fdc5bc78bad14c46294ec5c08b784/" rel="noopener noreferrer"&gt;xBoInRMFWK.py&lt;/a&gt;, the XOR loader&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bazaar.abuse.ch/sample/a0501b667a166efa07bfa4f376d24e97948c68661a13e37ce6a6029edcbee0aa/" rel="noopener noreferrer"&gt;The decrypted backdoor stage&lt;/a&gt;, decrypted from &lt;code&gt;Ac2cwRJF6zPS.bin&lt;/code&gt;; on a victim it only ever runs in memory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to &lt;a href="https://x.com/malwrhunterteam" rel="noopener noreferrer"&gt;@malwrhunterteam&lt;/a&gt; for spotting and posting the sample, and to &lt;a href="https://x.com/smica83" rel="noopener noreferrer"&gt;@smica83&lt;/a&gt; for sharing it on MalwareBazaar. Analysis by &lt;a href="https://tuxxin.com/services/cybersecurity#tk-snoopy" rel="noopener noreferrer"&gt;Snoopy Triage&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>malwareanalysis</category>
      <category>threatintelligence</category>
      <category>ethereum</category>
      <category>msi</category>
    </item>
    <item>
      <title>Docker UFW bypass: why ufw status says closed but the port is open</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Thu, 29 Oct 2026 14:19:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/docker-ufw-bypass-why-ufw-status-says-closed-but-the-port-is-open-42lf</link>
      <guid>https://dev.to/tuxxin/docker-ufw-bypass-why-ufw-status-says-closed-but-the-port-is-open-42lf</guid>
      <description>&lt;p&gt;A port published with &lt;code&gt;docker run -p 8080:80&lt;/code&gt; is reachable from the internet even when &lt;code&gt;ufw status&lt;/code&gt; shows no rule allowing it. Docker writes its own iptables rules, and traffic to a published port is forwarded to the container before it reaches the rules UFW manages. This guide shows the mechanism, how to see it on the host, how to confirm it from outside, and five ways to fix it, safest first. The facts below were checked against the Docker Engine 29 documentation (29.9.2 is the current release) in October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Docker bypasses UFW
&lt;/h2&gt;

&lt;p&gt;UFW keeps its rules in the iptables &lt;code&gt;INPUT&lt;/code&gt; chain, which handles traffic addressed to the host itself. When you publish a port, Docker adds two kinds of rules of its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;nat&lt;/code&gt; table, &lt;code&gt;PREROUTING&lt;/code&gt; jumps to Docker's &lt;code&gt;DOCKER&lt;/code&gt; chain, which rewrites the destination (DNAT) from the host's port 8080 to the container's address and port 80.&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;filter&lt;/code&gt; table, the &lt;code&gt;FORWARD&lt;/code&gt; chain jumps to Docker's chains, &lt;code&gt;DOCKER-USER&lt;/code&gt; and &lt;code&gt;DOCKER-FORWARD&lt;/code&gt;, which then accept the forwarded traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the destination is rewritten in &lt;code&gt;PREROUTING&lt;/code&gt;, the packet is routed to the container and travels through &lt;code&gt;FORWARD&lt;/code&gt;. Docker's documentation puts it directly: packets are diverted before they reach the &lt;code&gt;INPUT&lt;/code&gt; and &lt;code&gt;OUTPUT&lt;/code&gt; chains that ufw uses. A &lt;code&gt;ufw deny 8080&lt;/code&gt; rule sits in a chain this traffic never visits, so &lt;code&gt;ufw status&lt;/code&gt; looks correct while the port answers the whole internet.&lt;/p&gt;

&lt;p&gt;Two defaults widen the exposure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-p 8080:80&lt;/code&gt; with no host address binds every host address, &lt;code&gt;0.0.0.0&lt;/code&gt; and &lt;code&gt;[::]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;IPv6 rules (&lt;code&gt;ip6tables&lt;/code&gt;) have been on by default since Docker 27.0, and with the default userland proxy, the host's IPv6 addresses forward to the container even when the container network is IPv4-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Older guides mention &lt;code&gt;DOCKER-ISOLATION-STAGE-1&lt;/code&gt; and &lt;code&gt;-2&lt;/code&gt;. Docker 29.0 removed those chains, and Docker 28.0.1 moved most of its forwarding rules into &lt;code&gt;DOCKER-FORWARD&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  See it on the host
&lt;/h2&gt;

&lt;p&gt;Start with what Docker has published. The &lt;code&gt;PORTS&lt;/code&gt; column shows the bind address: &lt;code&gt;0.0.0.0:8080-&amp;gt;80/tcp&lt;/code&gt; and &lt;code&gt;[::]:8080-&amp;gt;80/tcp&lt;/code&gt; mean every interface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'table {{.Names}}\t{{.Ports}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List listening sockets. With the userland proxy, which is on by default, each published port shows a &lt;code&gt;docker-proxy&lt;/code&gt; process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show the port mappings in the &lt;code&gt;nat&lt;/code&gt; table and any filtering you have added in &lt;code&gt;DOCKER-USER&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-L&lt;/span&gt; DOCKER &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-L&lt;/span&gt; DOCKER-USER &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip6tables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-L&lt;/span&gt; DOCKER &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An empty &lt;code&gt;DOCKER-USER&lt;/code&gt; chain means nothing filters traffic to your published ports. Compare this with &lt;code&gt;sudo ufw status verbose&lt;/code&gt;: a port can appear in the &lt;code&gt;DOCKER&lt;/code&gt; chain with no matching UFW rule.&lt;/p&gt;

&lt;p&gt;If you run Docker with the experimental nftables backend (&lt;code&gt;"firewall-backend": "nftables"&lt;/code&gt;, added in 29.0), the iptables commands show nothing useful. Use &lt;code&gt;sudo nft list ruleset&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check it from outside
&lt;/h2&gt;

&lt;p&gt;The host's own view tells you what should be open. Only a scan from another network shows what is. From the server you want to check, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-4&lt;/span&gt; qsa.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;qsa.sh scans only the public IP the request comes from, and it has no way to target any other address. Before anything is sent, it prints the detected IP and starts a 15-second countdown. Ctrl-C cancels. The free scan checks the top 1,000 TCP ports with naabu 2.7.0, fingerprints each open service with nmap 7.993 and the vulners script, runs about 2,000 curated nuclei 3.11.1 checks, and streams the results live. It allows one scan per IP per 24 hours, and results are not stored.&lt;/p&gt;

&lt;p&gt;Know the limits before you trust a clean result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A container on an unusual high port can sit outside the top 1,000. The Full tier ($5/month) scans all 65,535 TCP ports, with results in roughly 2 to 12 minutes. See &lt;a href="https://qsa.sh/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt; and &lt;a href="https://qsa.sh/how-it-works" rel="noopener noreferrer"&gt;how it works&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;IPv6 callers are refused for now, which is why the command uses &lt;code&gt;curl -4&lt;/code&gt;. Check IPv6 exposure with nmap from another machine.&lt;/li&gt;
&lt;li&gt;CGNAT, mobile carrier, proxy, VPN and Tor exits are refused, so run it from the server itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three tools are open source, and you can run them yourself. From a machine on a different network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-Pn&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; YOUR_SERVER_IP
nmap &lt;span class="nt"&gt;-6&lt;/span&gt; &lt;span class="nt"&gt;-Pn&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; YOUR_SERVER_IPV6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fix it, safest option first
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Bind published ports to loopback
&lt;/h3&gt;

&lt;p&gt;If only a reverse proxy on the same host needs the container, publish it on &lt;code&gt;127.0.0.1&lt;/code&gt;, and on &lt;code&gt;[::1]&lt;/code&gt; if you need IPv6 locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 127.0.0.1:8080:80 nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:8080:80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put your reverse proxy (nginx, Caddy, Traefik) in front and expose only 80 and 443. Run a current Docker Engine: before 28.0.0, hosts on the same L2 segment could reach ports published to localhost, and 28.3.3 fixed CVE-2025-54388, where a firewalld reload could expose loopback-only ports to the LAN.&lt;/p&gt;

&lt;p&gt;To change the default for containers that leave out the host address, set &lt;code&gt;"ip": "127.0.0.1"&lt;/code&gt; in &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; for the default bridge, or the &lt;code&gt;com.docker.network.bridge.host_binding_ipv4&lt;/code&gt; option on a user-defined network.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Publish nothing; use a shared network
&lt;/h3&gt;

&lt;p&gt;Containers on the same user-defined network reach each other by name with no published ports. Only the proxy publishes anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;caddy&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The proxy forwards to &lt;code&gt;http://app:80&lt;/code&gt;, and the app has no host port for anyone to reach.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Filter in the DOCKER-USER chain
&lt;/h3&gt;

&lt;p&gt;Docker reserves &lt;code&gt;DOCKER-USER&lt;/code&gt; for your rules, and &lt;code&gt;FORWARD&lt;/code&gt; jumps to it before Docker's own chains. Packets here have already been rewritten, so a plain &lt;code&gt;--dport&lt;/code&gt; match sees the container's port. Match the original destination with conntrack. The rule that keeps established connections working has to come before any &lt;code&gt;DROP&lt;/code&gt;, and &lt;code&gt;-I&lt;/code&gt; inserts at the top, so add it last:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Drop internet traffic to the published host port 8080 (eth0 is the public interface)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; DOCKER-USER &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;-m&lt;/span&gt; conntrack &lt;span class="nt"&gt;--ctorigdstport&lt;/span&gt; 8080 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP

&lt;span class="c"&gt;# Or: allow only one admin network to reach any published port&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; DOCKER-USER &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; 192.0.2.0/24 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP

&lt;span class="c"&gt;# Then keep replies to existing connections flowing (inserted last, so it runs first)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; DOCKER-USER &lt;span class="nt"&gt;-m&lt;/span&gt; conntrack &lt;span class="nt"&gt;--ctstate&lt;/span&gt; RELATED,ESTABLISHED &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeat the rules with &lt;code&gt;ip6tables&lt;/code&gt; for IPv6. Rules added this way are lost on reboot unless you save them with your distribution's persistence tool, such as &lt;code&gt;netfilter-persistent&lt;/code&gt;. Docker's documentation notes that conntrack matching can cost some performance. The nftables backend has no &lt;code&gt;DOCKER-USER&lt;/code&gt; chain; its documentation describes putting your rules in your own table with a base chain on the forward hook.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use ufw-docker
&lt;/h3&gt;

&lt;p&gt;The third-party &lt;a href="https://github.com/chaifeng/ufw-docker" rel="noopener noreferrer"&gt;ufw-docker&lt;/a&gt; project adds a &lt;code&gt;DOCKER-USER&lt;/code&gt; block to &lt;code&gt;/etc/ufw/after.rules&lt;/code&gt; (and &lt;code&gt;after6.rules&lt;/code&gt;) that sends container traffic through UFW's forward rules. You then open container ports with route rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw-docker &lt;span class="nb"&gt;install
sudo &lt;/span&gt;systemctl restart ufw
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw route allow proto tcp from any to any port 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It keeps everything in UFW and survives reboots. It depends on &lt;code&gt;DOCKER-USER&lt;/code&gt;, so it cannot work with the nftables backend, and it has open issues about Docker 28 and 29 chain changes. Test the result from outside after installing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Disable Docker's iptables management (last resort)
&lt;/h3&gt;

&lt;p&gt;Setting &lt;code&gt;"iptables": false&lt;/code&gt; in &lt;code&gt;daemon.json&lt;/code&gt; stops Docker writing rules. Docker's documentation warns that this is likely to break container networking: containers lose outbound internet access through masquerading, and, with no replacement rules, all container ports are reachable from hosts on the local network. You would have to write the NAT and forwarding rules yourself. Use one of the options above unless you are prepared to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  firewalld and other hosts
&lt;/h2&gt;

&lt;p&gt;The same bypass applies to firewalld. Docker creates a firewalld zone named &lt;code&gt;docker&lt;/code&gt; with target &lt;code&gt;ACCEPT&lt;/code&gt; for its bridges, and a &lt;code&gt;docker-forwarding&lt;/code&gt; policy that allows forwarding from any zone to it, so rules on your public zone do not filter published ports. Bind to loopback or filter in &lt;code&gt;DOCKER-USER&lt;/code&gt;, exactly as above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Re-check from outside
&lt;/h2&gt;

&lt;p&gt;After the fix, scan again from outside and confirm the port is gone. The free qsa.sh scan allows one run per IP per 24 hours, so for a same-day re-check use nmap from another machine, or a Full token. To catch a new &lt;code&gt;-p&lt;/code&gt; flag the next time someone deploys, run a scheduled scan yourself: qsa.sh sends no alerts and runs no monitoring, and &lt;a href="https://qsa.sh/news/cron-monitor-exposure-changes" rel="noopener noreferrer"&gt;this cron script&lt;/a&gt; compares each scan with the last one. If you are wary of piping curl output anywhere, &lt;a href="https://qsa.sh/news/is-curl-bash-safe" rel="noopener noreferrer"&gt;this post&lt;/a&gt; explains why &lt;code&gt;curl qsa.sh&lt;/code&gt; only prints text.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does UFW block Docker published ports?
&lt;/h3&gt;

&lt;p&gt;No. UFW filters the &lt;code&gt;INPUT&lt;/code&gt; chain, and Docker forwards published-port traffic through &lt;code&gt;FORWARD&lt;/code&gt; after rewriting its destination in the &lt;code&gt;nat&lt;/code&gt; table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does ufw status say the port is closed?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ufw status&lt;/code&gt; lists UFW's own rules. Docker's DNAT and forwarding rules live in separate chains that UFW does not report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is binding to 127.0.0.1 enough?
&lt;/h3&gt;

&lt;p&gt;On Docker Engine 28.3.3 or later, yes for internet exposure. Older releases let hosts on the same L2 network reach localhost-published ports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this affect IPv6?
&lt;/h3&gt;

&lt;p&gt;Yes. Unbound ports listen on &lt;code&gt;[::]&lt;/code&gt;, and &lt;code&gt;ip6tables&lt;/code&gt; is on by default. qsa.sh does not scan IPv6 yet, so check it with &lt;code&gt;nmap -6&lt;/code&gt; from another network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the free scan cover every port?
&lt;/h3&gt;

&lt;p&gt;It covers the top 1,000 TCP ports. The Full tier scans all 65,535.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ufw</category>
      <category>firewall</category>
      <category>iptables</category>
    </item>
    <item>
      <title>Free URL scanner: check a link before you open it</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Wed, 28 Oct 2026 14:13:04 +0000</pubDate>
      <link>https://dev.to/tuxxin/free-url-scanner-check-a-link-before-you-open-it-2ael</link>
      <guid>https://dev.to/tuxxin/free-url-scanner-check-a-link-before-you-open-it-2ael</guid>
      <description>&lt;p&gt;The whack.sh &lt;a href="https://whack.sh/url-scanner" rel="noopener noreferrer"&gt;URL scanner&lt;/a&gt; is free to use, with no account needed. Paste a suspicious link, and our browser opens it once in a fresh, isolated Chromium browser on our datacenter network. You get a report on the page without ever opening it yourself.&lt;/p&gt;

&lt;p&gt;A quick human check (Cloudflare Turnstile) runs before each scan. &lt;a href="https://whack.sh/url-scanner" rel="noopener noreferrer"&gt;Scan a link now&lt;/a&gt;, or open the &lt;a href="https://whack.sh/example-report" rel="noopener noreferrer"&gt;example report&lt;/a&gt; to see what you get back.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the report shows
&lt;/h2&gt;

&lt;p&gt;Every report includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A verdict&lt;/li&gt;
&lt;li&gt;A risk score from 0 to 100&lt;/li&gt;
&lt;li&gt;The top 3 signals behind the verdict&lt;/li&gt;
&lt;li&gt;Every redirect from the link to the final page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without an account, you can run 5 scans per hour from one browser and network, on pages up to 25 MB. These scans come without a screenshot. Each scan gets a private report link that works for 7 days, and anyone with the link can open it.&lt;/p&gt;

&lt;h2&gt;
  
  
  More with a free account
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://whack.sh/auth/signup" rel="noopener noreferrer"&gt;free account&lt;/a&gt; raises the limit to 10 datacenter scans per hour, with any page size. It adds a screenshot of every page and the full report: every signal, the request log, and HAR and IOC export. Captures are kept for 30 days, and the account includes API access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://whack.sh/pricing" rel="noopener noreferrer"&gt;Paid plans&lt;/a&gt; add residential and mobile vantage points, with a side-by-side comparison of what each one received. They are billed in credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a clean result means
&lt;/h2&gt;

&lt;p&gt;Some malicious sites show scanners and datacenter visitors a harmless page, then send home and mobile visitors to the attack. This is called cloaking. A clean result means our datacenter browser saw nothing harmful. A visitor on a home or mobile connection can still receive a different page.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whack.sh/multi-source-url-scanner" rel="noopener noreferrer"&gt;multi-source scanner&lt;/a&gt; loads the same link through datacenter, residential and mobile connections and compares the results.&lt;/p&gt;

&lt;p&gt;The site also sees the visit. Our browser loads the page once from a datacenter IP address. If the link is a tracking link from an email, the scan tells the sender the email was opened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and fair use
&lt;/h2&gt;

&lt;p&gt;Scans run without an account are never contributed or sold. After 7 days the report is deleted, unless the scan is under an abuse or legal hold. Our &lt;a href="https://whack.sh/privacy" rel="noopener noreferrer"&gt;privacy policy&lt;/a&gt; has the details.&lt;/p&gt;

&lt;p&gt;Scan links you received or plan to visit. Do not use the scanner to test or attack sites. The free scanner may pause during heavy use, and it is not available in a few regions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://whack.sh/url-scanner" rel="noopener noreferrer"&gt;Check a link before you open it&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>urlscanning</category>
      <category>freetools</category>
      <category>phishing</category>
      <category>malware</category>
    </item>
    <item>
      <title>Empire War adds Office Tower, Trade Route and new artwork</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Tue, 27 Oct 2026 14:13:01 +0000</pubDate>
      <link>https://dev.to/tuxxin/empire-war-adds-office-tower-trade-route-and-new-artwork-2f66</link>
      <guid>https://dev.to/tuxxin/empire-war-adds-office-tower-trade-route-and-new-artwork-2f66</guid>
      <description>&lt;p&gt;&lt;a href="https://empirewar.co" rel="noopener noreferrer"&gt;Empire War&lt;/a&gt;, Tuxxin's free browser tycoon game, shipped five updates this week, versions 1.20 to 1.24, between October 22 and 26, 2026. Two new side games lead the list: Office Tower, where you build and staff your company's headquarters, and Trade Route, a 30-day commodity trading run. Around them, every division, deal and collectible got new artwork, the IPO Center was rebuilt, player profiles were redesigned, a Temp Agency now speeds up deal cooldowns, and the menus got easier to find your way around.&lt;/p&gt;

&lt;p&gt;Empire War is an idle business game played in the browser. You close deals for cash and XP, run divisions across six industries for passive income, hire and manage employees, launch hostile takeovers against real players, keep your SEC Heat under control, and take the company public through an IPO for permanent prestige bonuses. There is no download, no app store and no pay-to-win.&lt;/p&gt;

&lt;h2&gt;
  
  
  New side game: Office Tower
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyxxpk1vsafyq3rbrh4zp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyxxpk1vsafyq3rbrh4zp.webp" alt="Cutaway illustration of an office tower at night, with every floor lit and staff at work" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Office Tower, launched October 24 in v1.23, is an office builder inside the game. Your headquarters has six rooms, and each one powers up a different part of your empire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server Room:&lt;/strong&gt; more division income.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales Floor:&lt;/strong&gt; higher deal success.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal Dept:&lt;/strong&gt; less SEC Heat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gym:&lt;/strong&gt; faster AP recharge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Office:&lt;/strong&gt; stronger PvP attack and defense.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cafeteria:&lt;/strong&gt; lower salaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rooms level up as high as your CEO level. Early levels build in minutes, while big upgrades take days or even weeks, and you have two builders, so there is always something under construction. Perks grow with every level. At full morale they approach +30% income, +15% deal success, 60% less Heat, 30% faster AP, +40% PvP power and 30% lower salaries.&lt;/p&gt;

&lt;p&gt;Your staff need desks. The office seats 5 to start, and every room level adds 2 more. Your staff cap is the lower of your desks and your CEO-level cap. The office unlocks when you reach 5 employees, with a "Your business is growing, time to get office space" moment. Existing players received free room levels, so nobody lost staff capacity.&lt;/p&gt;

&lt;p&gt;Team morale runs from 0 to 100. It drops a little every hour and scales every room perk between 50% and 100%. Pizza Parties, Team Lunches and Year-End Bonuses raise it, and a Late-Night Push spends morale for a burst of cash and XP. Prices scale with your own income, so building is worth it at any level, and your office survives an IPO.&lt;/p&gt;

&lt;h2&gt;
  
  
  New side game: Trade Route
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zrvonweu6q2sw3opdv5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zrvonweu6q2sw3opdv5.webp" alt="A loaded cargo ship sailing out of a busy harbor at dusk" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trade Route, launched October 26 in v1.24, is a trading game inspired by classics like Drug Wars. Each run lasts 30 days. You start with $2,000 and a $5,500 loan from a venture capitalist, and the loan grows 10% a day.&lt;/p&gt;

&lt;p&gt;You trade 7 commodities, from coffee at around $10 to gold at around $30,000, across 6 world markets: New York, London, Dubai, Tokyo, Shanghai and Sao Paulo. Each market sells some goods cheap and pays well for others:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dubai: oil&lt;/li&gt;
&lt;li&gt;Tokyo: microchips&lt;/li&gt;
&lt;li&gt;Sao Paulo: coffee&lt;/li&gt;
&lt;li&gt;London: gold&lt;/li&gt;
&lt;li&gt;Shanghai: steel and lithium&lt;/li&gt;
&lt;li&gt;New York: pharmaceuticals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prices change every day, and some goods sell out. Sailing between markets takes a day, and trouble finds you on the way: customs stops where you pay up or risk losing half your cargo, pirates, storms, offers of extra cargo space, abandoned containers, and sudden crashes and shortages.&lt;/p&gt;

&lt;p&gt;You can repay the loan by wire from any port, and borrow more in person in New York. A run costs 20 AP, and you can cash out at any time. Your score is your cash minus the loan.&lt;/p&gt;

&lt;p&gt;Beat your starting cash and you earn real cash and XP for your main company, worth up to 4 hours of your division income, on your first 3 runs each day. Every run counts toward the weekly and all-time Trade Route leaderboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  A full visual overhaul
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkzwss369dnhx1eop9g4s.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkzwss369dnhx1eop9g4s.webp" alt="A boardroom table set with stacks of cash and an open briefcase" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Versions 1.20 to 1.22 redrew the game. Each of the 90 divisions, all 31 deals and all 40 collectible loot items has its own icon. Employee titles and specialties, deal tiers and achievement categories have icons too.&lt;/p&gt;

&lt;p&gt;Color now carries meaning. Each of the six industries has its own color: Technology blue, Energy yellow, Media purple, Finance green, Real Estate orange and Retail pink. Collectibles are framed in their rarity color, from gray Common to gold Legendary.&lt;/p&gt;

&lt;p&gt;Illustrated banners now open the HQ, Deals, Divisions, Staff, PvP, Collections, Achievements, IPO Center, Power 500 and Missions pages, with the page title laid over the art, and each industry in the division shop has its own banner.&lt;/p&gt;

&lt;p&gt;Closing a deal feels like a payday. A payout card shows the deal's icon while your cash and XP count up, loot drops appear as a card in their rarity color, and level-ups get their own banner.&lt;/p&gt;

&lt;p&gt;Progress is visible everywhere. Bars fill as deal cooldowns and division upgrades run, each division shows a 10-step level meter, and the top bar shows your XP progress and your SEC Heat shifting from green to red.&lt;/p&gt;

&lt;h2&gt;
  
  
  A redesigned IPO Center
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F606nwztv2gca2kj50pa6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F606nwztv2gca2kj50pa6.webp" alt="A stock exchange bell ringing under a shower of confetti" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IPO Center, rebuilt in v1.22, lays out a clear four-step road to going public: reach Level 25, complete 3 IPO Preparations, wait out a 24-hour Quiet Period, then Go Public.&lt;/p&gt;

&lt;p&gt;The IPO Preparation deal shows its cost, reward and progress, with a live cooldown countdown. A new "If you went public now" panel estimates your exit valuation, your starting cash and your weekly dividends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redesigned player profiles
&lt;/h2&gt;

&lt;p&gt;Every player profile has been rebuilt. It opens with an industry-art banner carrying the company crest, the CEO level and achievement rings, and the player's PvP win rate.&lt;/p&gt;

&lt;p&gt;Below that are lifetime career stats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;login streak;&lt;/li&gt;
&lt;li&gt;deals closed and deal success rate;&lt;/li&gt;
&lt;li&gt;missions completed;&lt;/li&gt;
&lt;li&gt;Guess the Bigger Company win rate;&lt;/li&gt;
&lt;li&gt;Office Tower levels;&lt;/li&gt;
&lt;li&gt;Trade Route runs and best score.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The profile also breaks down the empire by industry and shows recent achievements, collection badges and an IPO timeline. You can open any player's profile from the &lt;a href="https://empirewar.co/leaderboards" rel="noopener noreferrer"&gt;Power 500&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  New: the Temp Agency
&lt;/h2&gt;

&lt;p&gt;The Temp Agency, launched October 26, sits on the Deals page. Once a day you can hire temps who instantly cut time off every deal on cooldown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intern Pool:&lt;/strong&gt; 15 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract Closers:&lt;/strong&gt; 1 hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consulting Team:&lt;/strong&gt; 3 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executive Temps:&lt;/strong&gt; 8 hours.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prices scale with your income. It is a handy shortcut for squeezing in the last deals before a level-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Easier to find, plus smaller fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Both side games live under Missions in the menu and in a new "Side games" panel on your HQ.&lt;/li&gt;
&lt;li&gt;The Deals page remembers which tier you were on.&lt;/li&gt;
&lt;li&gt;Collections show how many spare copies you can scrap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full details are in the &lt;a href="https://empirewar.co/news" rel="noopener noreferrer"&gt;patch notes&lt;/a&gt;, and the &lt;a href="https://empirewar.co/how-to-play" rel="noopener noreferrer"&gt;How to Play guide&lt;/a&gt; has complete sections on Office Tower and Trade Route. Questions are answered in the &lt;a href="https://empirewar.co/faq" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;, and the &lt;a href="https://empirewar.co/leaderboards" rel="noopener noreferrer"&gt;Power 500 leaderboard&lt;/a&gt; shows who is on top right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play free at empirewar.co
&lt;/h2&gt;

&lt;p&gt;Empire War is free to play in your browser, with no download and no pay-to-win. Build your first office, run your first trade route and start climbing the Power 500. &lt;a href="https://empirewar.co/auth/register" rel="noopener noreferrer"&gt;Play free at empirewar.co&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>empirewar</category>
      <category>browsergames</category>
      <category>idlegames</category>
      <category>tycoongame</category>
    </item>
    <item>
      <title>The Week Eye is live: a free stereogram puzzle every Monday</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 26 Oct 2026 23:05:59 +0000</pubDate>
      <link>https://dev.to/tuxxin/the-week-eye-is-live-a-free-stereogram-puzzle-every-monday-4egg</link>
      <guid>https://dev.to/tuxxin/the-week-eye-is-live-a-free-stereogram-puzzle-every-monday-4egg</guid>
      <description>&lt;p&gt;&lt;a href="https://theweekeye.com/" rel="noopener noreferrer"&gt;The Week Eye&lt;/a&gt; is a free weekly puzzle built on stereograms: flat patterns of colored dots that hide a 3D word or shape. A new image goes live every Monday at 8:00 a.m. Eastern. Find the hidden answer, type it, and the server times your solve. The first puzzle, week 44, is live now and closes Monday, November 2 at 8:00 a.m. Eastern.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4oif44zpudafrws0j6r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4oif44zpudafrws0j6r.webp" alt="Practice stereogram from The Week Eye lessons. Viewed in 3D, a large square floats in front of the dot pattern." width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The easiest practice image from the lessons. A large square floats in front of the pattern.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to play
&lt;/h2&gt;

&lt;p&gt;Press Start, and the clock begins when the image appears. Bring your face close to the screen so the image blurs, look through it as if at something far behind it, then lean back slowly. When the two dots above the image become three, your eyes are set and the answer rises out of the pattern. Type it and press Check.&lt;/p&gt;

&lt;p&gt;On a phone, turn it sideways to see the image full screen, then turn it back upright to type. Anyone can play without an account. To get your time on the leaderboard, sign in before you start. Sign-in takes an email address and a 6-digit code, with no password.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leaderboards and streaks
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://theweekeye.com/leaderboard" rel="noopener noreferrer"&gt;weekly board&lt;/a&gt; ranks solves by fewest guesses, then fastest time, and updates with every solve. Last week's board is final once the new puzzle drops. The all-time board ranks the longest current streaks, counted in weeks solved in a row, with badges at 4, 12, 26 and 52 weeks. Solves under 4 seconds are listed but stay unranked until they are reviewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn to see it
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://theweekeye.com/how-to-see-it" rel="noopener noreferrer"&gt;lessons&lt;/a&gt; walk through six practice images, from a flat pattern with nothing hidden to a hard weekly level, and each one has a check so you know you saw it. The &lt;a href="https://theweekeye.com/guides" rel="noopener noreferrer"&gt;guides&lt;/a&gt; cover parallel and cross-eyed viewing, playing on a phone, and the usual reasons the picture will not appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eye Trials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://theweekeye.com/eye-trials" rel="noopener noreferrer"&gt;Eye Trials&lt;/a&gt; is a daily challenge with ten levels. Each attempt is a fresh image with one guess, and the next attempt opens 24 hours later. Every level has less depth, a busier pattern or a tilted answer than the one before, and a wrong answer sends you back to level 1. Clear all ten in one run to earn the Sharp Eye rank. Eye Trials needs a free account to save your progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the images are made
&lt;/h2&gt;

&lt;p&gt;Every image is generated by code, with no AI. A depth map of the answer becomes a repeating dot pattern through the linked-pixel method that Thimbleby, Inglis and Witten published in 1994. Before an image is queued, an automatic check confirms that the hidden picture is present and that the flat pattern does not reveal the answer. Each week's image comes in 20 variants, and a holiday or daily observance sets the theme.&lt;/p&gt;

&lt;p&gt;When a week closes, its image, answer, depth map and final results move to the &lt;a href="https://theweekeye.com/archive" rel="noopener noreferrer"&gt;archive&lt;/a&gt;. Closed weeks make good practice because you can check what you see against the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the puzzle by email
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://theweekeye.com/subscribe" rel="noopener noreferrer"&gt;weekly email&lt;/a&gt; arrives each Monday when the new puzzle goes live. It carries last week's answer, plus your streak if you have an account, and every email has a one-click unsubscribe link.&lt;/p&gt;

&lt;p&gt;The Week Eye is built and run by &lt;a href="https://tuxxin.com/" rel="noopener noreferrer"&gt;Tuxxin&lt;/a&gt; in Orlando, Florida.&lt;/p&gt;

</description>
      <category>stereogram</category>
      <category>puzzle</category>
      <category>3d</category>
      <category>weeklypuzzle</category>
    </item>
    <item>
      <title>Hunting adversary infrastructure with issued.live and WorldIP.io</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:50:00 +0000</pubDate>
      <link>https://dev.to/tuxxin/hunting-adversary-infrastructure-with-issuedlive-and-worldipio-49ao</link>
      <guid>https://dev.to/tuxxin/hunting-adversary-infrastructure-with-issuedlive-and-worldipio-49ao</guid>
      <description>&lt;p&gt;Hunting adversary infrastructure starts from one indicator, usually an IP address, and works outward to the operator's other servers and domains. Two Tuxxin tools cover that work. &lt;a href="https://worldip.io" rel="noopener noreferrer"&gt;WorldIP.io&lt;/a&gt; enriches the address: who holds it, how it is routed and what kind of traffic leaves it. &lt;a href="https://issued.live" rel="noopener noreferrer"&gt;issued.live&lt;/a&gt; pivots from it: every hostname seen answering there and the certificates behind them. Until WorldIP.io's paid plans launch, every issued.live Plus or Pro subscription includes a free beta key to the WorldIP.io premium API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The offer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;issued.live Plus&lt;/strong&gt; ($99 a month) includes a WorldIP.io &lt;strong&gt;Pro&lt;/strong&gt; key: 200,000 enriched lookups a month with VPN, proxy, Tor and datacenter classification, a trust score and blocklist hits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issued.live Pro&lt;/strong&gt; ($199 a month) includes a WorldIP.io &lt;strong&gt;Business&lt;/strong&gt; key: 1,000,000 enriched lookups a month, adding live BGP prefixes and MOAS conflicts, BGP anomaly events and Web3 node roles.&lt;/li&gt;
&lt;li&gt;The key is emailed within one business day to the address on the issued.live subscription. It works through the WorldIP.io beta and for 30 days after the paid plans launch, which is planned within the next 30 days.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  IOC enrichment: what the address is
&lt;/h2&gt;

&lt;p&gt;An IP address from an alert carries little on its own. A WorldIP.io lookup enriches it with the organization, ASN and ASN type, regional registry ownership, city-level geolocation where it exists, the network's access type, blocklist hits, a trust score from 0 to 100 and a proxy verdict. The Business key adds routing context: whether the prefix has a multiple-origin conflict and whether it appeared in a recent BGP anomaly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pivoting threat intelligence: what has run at the address
&lt;/h2&gt;

&lt;p&gt;issued.live turns the address into infrastructure. Its reverse IP lookup returns every hostname its resolvers have recorded answering there, with first-seen and last-seen times, and a range lookup does the same for up to 256 addresses at once. Certificate pivots return the other names on each certificate. SPKI pivots return every certificate issued for the same key pair, which reaches servers on other addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked hunt from one IP address
&lt;/h2&gt;

&lt;p&gt;Most hunts start from a firewall hit, an EDR callback or a sender address in a phishing email header. From there:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enrich the address.&lt;/strong&gt; The WorldIP.io profile says whether it sits on a hosting provider's range, on a home ISP or behind a proxy, and whether its route is under dispute. That decides how much weight the rest of the hunt carries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List what runs there.&lt;/strong&gt; An issued.live reverse IP lookup returns the hostnames with their first-seen dates. A burst of new names inside a few days is the usual sign of a fresh campaign, and &lt;a href="https://tuxxin.com/blog/reverse-ip-to-domain-fleet" rel="noopener noreferrer"&gt;one lookup mapped 532 hostnames this way&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pivot on certificates and keys.&lt;/strong&gt; The certificates behind those names lead to other names and, through shared public keys, to other addresses. Each new address goes back to step one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search the naming grammar.&lt;/strong&gt; On Pro, &lt;a href="https://tuxxin.com/blog/issued-live-pattern-search" rel="noopener noreferrer"&gt;pattern search&lt;/a&gt; matches the shape of the names, such as a short word followed by &lt;code&gt;agent&lt;/code&gt; in &lt;code&gt;.com&lt;/code&gt;, against every registrable domain in the corpus.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;issued.live's guide to &lt;a href="https://issued.live/news/find-domains-in-ip-range" rel="noopener noreferrer"&gt;find domains in an IP range&lt;/a&gt; covers the range endpoint and the certificate pivots in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug bounty reconnaissance
&lt;/h2&gt;

&lt;p&gt;Certificate Transparency and reverse IP data map a target's hostnames without sending a packet to it. issued.live lists the names on the target's certificates and the hostnames that share its addresses. WorldIP.io's organization and ASN fields then show which of those addresses sit on the target's own network and which belong to a CDN or a cloud provider, which decides where the in-scope servers are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fraud and sign-up screening
&lt;/h2&gt;

&lt;p&gt;The same WorldIP.io classification can gate a form. One lookup per sign-up returns &lt;code&gt;is_proxy&lt;/code&gt;, &lt;code&gt;is_vpn&lt;/code&gt;, &lt;code&gt;is_tor&lt;/code&gt;, &lt;code&gt;is_datacenter&lt;/code&gt; and a &lt;code&gt;verdict&lt;/code&gt;, so a form can deny detected proxies, send datacenter traffic to review or log the verdict next to each account. WorldIP.io's guide explains &lt;a href="https://worldip.io/news/how-to-detect-residential-proxies" rel="noopener noreferrer"&gt;how to detect residential proxies&lt;/a&gt; and mobile proxies with those fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free threat intel API tiers
&lt;/h2&gt;

&lt;p&gt;Both tools also answer without a key. WorldIP.io's keyless API returns the owner, ASN, country, reverse DNS and CIDR block for any address, plus the number of domains hosted on an IPv4 address, up to 1,000 lookups a day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl worldip.io/8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;issued.live's free public record covers any domain's certificate, issuer, expiry, hosting address and current DNS, plus its registration dates and registrar, also at 1,000 requests a day per client address. The paid tiers and the beta key add the pivots and the enriched profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The offer covers issued.live Plus and Pro. issued.live Basic is not included.&lt;/li&gt;
&lt;li&gt;The WorldIP.io key stays active while the issued.live subscription does.&lt;/li&gt;
&lt;li&gt;The beta carries the monthly quotas above and has no uptime guarantee.&lt;/li&gt;
&lt;li&gt;The WorldIP.io limits may change during the beta; key holders are emailed before any change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plans are on the &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;issued.live pricing page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>threathunting</category>
      <category>threatintelligence</category>
      <category>ipintelligence</category>
      <category>reverseiplookup</category>
    </item>
    <item>
      <title>Scam ads in Yahoo Mail hid a fake Microsoft support alert</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:44:37 +0000</pubDate>
      <link>https://dev.to/tuxxin/scam-ads-in-yahoo-mail-hid-a-fake-microsoft-support-alert-447m</link>
      <guid>https://dev.to/tuxxin/scam-ads-in-yahoo-mail-hid-a-fake-microsoft-support-alert-447m</guid>
      <description>&lt;p&gt;Sponsored messages in the AT&amp;amp;T edition of Yahoo Mail led some readers to a fake Microsoft security alert. The alert told them to call a support number. Our visits from a data center or a phone got a dating or personal finance article instead.&lt;/p&gt;

&lt;p&gt;William Vincent, a whack.sh customer, noticed something off about the ads and asked Tuxxin to dig further.&lt;/p&gt;

&lt;p&gt;We traced two scam operations through the same ad slot on October 7 and 8, 2026. One of them had also used a Taboola ad on September 24.&lt;/p&gt;

&lt;p&gt;The scam kit behind the first ad appears in 747 public scans from July 12 to October 10, the 90 days our search could reach. Those scans cover 536 cloud hostnames and 160 phone numbers.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whack.sh/news/yahoo-mail-malvertising-tech-support-scam" rel="noopener noreferrer"&gt;technical writeup on whack.sh&lt;/a&gt; traces both ad chains hop by hop and lists every indicator.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ad looked like a new message
&lt;/h2&gt;

&lt;p&gt;The ad sat in the inbox list like an email. Its sender line read "CHECKOUTERS" and its subject read "(1) New Message". A small "Ad" label marked it as sponsored.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tuxxin.com/uploads/blog/2026/10/yahoo-mail-scam-ads-inbox-ad.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7lpust3998si8wer4gc.webp" alt="The AT&amp;amp;T edition of Yahoo Mail with a sponsored inbox row from Checkouters that reads New and (1) New Message, outlined in orange." width="798" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The ad row in AT&amp;amp;T Yahoo Mail, October 2026. Screenshot by William Vincent, cropped to the ad, with personal details removed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Taboola sells the native ads across Yahoo's sites under a &lt;a href="https://www.taboola.com/press-releases/taboola-yahoo-native-deal/" rel="noopener noreferrer"&gt;30-year agreement&lt;/a&gt;. Yahoo's ad space &lt;a href="https://www.taboola.com/press-releases/yahoo-properties-worldwide/" rel="noopener noreferrer"&gt;opened to Taboola advertisers worldwide&lt;/a&gt; in October 2023. When it announced the deal in 2022, Taboola said Yahoo reached nearly 900 million monthly users worldwide.&lt;/p&gt;

&lt;p&gt;A click on the ad passed through Taboola's click tracker under the publisher ID "yahoo-mail-att". That is the AT&amp;amp;T edition of Yahoo Mail, which serves att.net, sbcglobal.net, bellsouth.net and other AT&amp;amp;T addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  In our scans, only Windows desktops on home broadband got the scam
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://whack.sh/multi-source-url-scanner" rel="noopener noreferrer"&gt;whack.sh&lt;/a&gt;, Tuxxin's URL scanner, opens one link from several networks at once and compares what each receives. It scanned the original ad click links that William Vincent sent us.&lt;/p&gt;

&lt;p&gt;Windows desktops on home broadband lines at Comcast, Charter and Cox got the scam. One Comcast visit got the scam and the next got the plain article. An Android phone on T-Mobile got a dating article, and a visit from a data center in France got a personal loan article.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tuxxin.com/uploads/blog/2026/10/yahoo-mail-scam-ads-scan-comparison.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsm24z1v02ki3eff9t1q.webp" alt="Two captures of the second ad's link side by side: a personal loan article from a data center, and a fake Windows Defender alert over a Microsoft support page from home broadband." width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same ad link from a data center and from home broadband. whack.sh scan, October 8, 2026. The phone numbers are stamped FAKE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The scam only appeared on visits that arrived through a fresh ad click. We opened the first ad's landing page directly eight times. Every visit returned the dating article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two operations used the same ad slot
&lt;/h2&gt;

&lt;p&gt;The first ad led to a dating article site that covered itself with a full-screen frame from Microsoft Azure. The frame showed the fake alert while the address bar kept showing the dating site.&lt;/p&gt;

&lt;p&gt;The second ad passed through a Branch deep link and a filtering server (TDS) that sorted visitors by network. Our home broadband visit went to a scam page on Azure with a live chat window. The same chat account appeared on another scam page on September 24, reached through a Taboola ad.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scam kit runs on hundreds of cloud hostnames
&lt;/h2&gt;

&lt;p&gt;The first operation's scam page comes from a kit, a set of files reused on every host. Public scans recorded it on 536 hostnames between July 12 and October 10, 2026, most of them on Microsoft Azure Container Apps. A second review by Kirk of &lt;a href="https://ohey.ca/" rel="noopener noreferrer"&gt;ohey.ca&lt;/a&gt; added 31 of those hostnames. The pages listed 160 phone numbers, 126 of them US toll-free numbers.&lt;/p&gt;

&lt;p&gt;The kit sends each visitor to a version for their operating system: Windows, macOS, Android or iOS. The Windows version adds a fake locked screen with a Microsoft account sign-in box. Its fields are read-only, and the box points the visitor to the phone number.&lt;/p&gt;

&lt;p&gt;When we re-checked the hostnames on October 11, nine still served the kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many people saw the ads
&lt;/h2&gt;

&lt;p&gt;Taboola holds the impression and click counts for both ads. We reported both ad chains to Taboola on October 11, 2026 and requested those counts. No exposure counts have been supplied.&lt;/p&gt;

&lt;p&gt;The first ad's tracking link listed a cost of 0.25 per click, with no currency.&lt;/p&gt;

&lt;p&gt;Victims reported &lt;a href="https://www.ic3.gov/AnnualReport/Reports/2024_ic3report.pdf" rel="noopener noreferrer"&gt;$1.46 billion in tech support fraud losses in 2024&lt;/a&gt; to the FBI's Internet Crime Complaint Center. People aged 60 and over reported $982 million of that total.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we reported
&lt;/h2&gt;

&lt;p&gt;The scammers used services from each company below. We sent each one the evidence for its part on October 11, 2026, and filed reports with the FTC and the FBI.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Recipient&lt;/th&gt;
&lt;th&gt;What we sent&lt;/th&gt;
&lt;th&gt;Response as of October 11&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Taboola&lt;/td&gt;
&lt;td&gt;Both ad chains, with a request for impression and click counts&lt;/td&gt;
&lt;td&gt;Case opened&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Yahoo&lt;/td&gt;
&lt;td&gt;Screenshots and a short alert offering the full report and indicator list. Its form could not take the full report.&lt;/td&gt;
&lt;td&gt;Case opened&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Microsoft Azure abuse portal&lt;/td&gt;
&lt;td&gt;The Azure-hosted scam pages. Only the side-by-side capture above could be attached, so the hostname lists were left out.&lt;/td&gt;
&lt;td&gt;Submitted, no case number given&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Microsoft Report Fraud&lt;/td&gt;
&lt;td&gt;The Microsoft impersonation and tech support scam&lt;/td&gt;
&lt;td&gt;"Your request has been submitted."&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;The two deep link apps in the ad chains&lt;/td&gt;
&lt;td&gt;"Thank you for your feedback!"&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Tawk.to&lt;/td&gt;
&lt;td&gt;The live chat account on the scam pages&lt;/td&gt;
&lt;td&gt;"Report received."&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;apiip.net&lt;/td&gt;
&lt;td&gt;The API key the scam pages used for location lookups&lt;/td&gt;
&lt;td&gt;No reply&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;The filtering server (TDS) address and the ad redirect chain&lt;/td&gt;
&lt;td&gt;No reply&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Namecheap&lt;/td&gt;
&lt;td&gt;The filtering server (TDS) domain and the ad redirect chain&lt;/td&gt;
&lt;td&gt;Case opened&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Cloudflare Registrar&lt;/td&gt;
&lt;td&gt;The ad landing domain, checkouters[.]app&lt;/td&gt;
&lt;td&gt;Case opened&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Cloudflare Trust and Safety&lt;/td&gt;
&lt;td&gt;checkouters[.]app, then further context and a list of 13 Cloudflare Workers and Pages hosts running the kit&lt;/td&gt;
&lt;td&gt;Said it could not detect abusive or malicious content and asked for more specific information. No reply yet to our follow-ups.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Laravel Forge&lt;/td&gt;
&lt;td&gt;34 on-forge[.]com hosts running the kit&lt;/td&gt;
&lt;td&gt;Laravel Security said it disabled "the domain in question" and notified the responsible party. The reply did not name the host, and we have not checked the result.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;REG.RU&lt;/td&gt;
&lt;td&gt;The tracker domain and how the scam pages used it&lt;/td&gt;
&lt;td&gt;Request opened&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Stellar Group&lt;/td&gt;
&lt;td&gt;The tracker's server&lt;/td&gt;
&lt;td&gt;No reply&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;FTC&lt;/td&gt;
&lt;td&gt;The scheme and the callback numbers&lt;/td&gt;
&lt;td&gt;Report filed&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;FBI IC3&lt;/td&gt;
&lt;td&gt;The ad chains, callback numbers and technical evidence&lt;/td&gt;
&lt;td&gt;Complaint filed&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the evening of October 11, Microsoft Edge showed a phishing warning for checkouters[.]app. When the warning first appeared, and what triggered it, is unknown.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you saw this alert
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://support.microsoft.com/en-us/security/avoid-and-report-microsoft-technical-support-scams" rel="noopener noreferrer"&gt;Microsoft states&lt;/a&gt; that genuine Microsoft error messages never include a phone number to call. Close the browser tab. If the page blocks closing, end the browser in Task Manager on Windows or with Force Quit on a Mac.&lt;/p&gt;

&lt;p&gt;If you called the number, uninstall any remote access tool the caller asked you to install. Change your passwords from another device and call your bank if you paid. Report the call at ic3.gov and reportfraud.ftc.gov.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators
&lt;/h2&gt;

&lt;p&gt;Domains are defanged. The &lt;a href="https://whack.sh/news/yahoo-mail-malvertising-tech-support-scam" rel="noopener noreferrer"&gt;whack.sh writeup&lt;/a&gt; has the full indicator list, and the 536 kit hostnames are in &lt;a href="https://tuxxin.com/dl/yahoo-mail-scam-kit-hosts-2026-10-10.csv" rel="noopener noreferrer"&gt;this CSV file&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ad landing page: &lt;code&gt;checkouters[.]app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Filtering server (TDS): &lt;code&gt;maizerubyen[.]site&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Scam pages: &lt;code&gt;zingaaf23-4.salmonmushroom-f0512d66.westus2.azurecontainerapps[.]io&lt;/code&gt; and &lt;code&gt;w08win10m844n2491c001.z13.web.core.windows[.]net&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Phone numbers: +1 844-959-2491, +1 888-883-5786 and +1 866-949-7055&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This report is the original work of Tuxxin LLC, published under &lt;a href="https://creativecommons.org/licenses/by-nd/4.0/" rel="noopener noreferrer"&gt;Creative Commons Attribution-NoDerivatives 4.0&lt;/a&gt;. Media and researchers may quote and republish it with attribution to Daniel Jones, Tuxxin LLC. The inbox screenshot appears with William Vincent's permission and is excluded from the license. For coordinated disclosure: &lt;a href="mailto:contact@tuxxin.com"&gt;contact@tuxxin.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>techsupportscam</category>
      <category>yahoomail</category>
      <category>malvertising</category>
      <category>microsoftimpersonation</category>
    </item>
    <item>
      <title>Tuxxin launches Webfetch, a ScrapingBee-compatible scraping API</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:44:26 +0000</pubDate>
      <link>https://dev.to/tuxxin/tuxxin-launches-webfetch-a-scrapingbee-compatible-scraping-api-25lf</link>
      <guid>https://dev.to/tuxxin/tuxxin-launches-webfetch-a-scrapingbee-compatible-scraping-api-25lf</guid>
      <description>&lt;p&gt;Webfetch, a web scraping API built and run by Tuxxin, is open at &lt;a href="https://webfetch.io" rel="noopener noreferrer"&gt;webfetch.io&lt;/a&gt;. A request names a URL and gets the page back as rendered HTML, plain text, markdown, or JSON pulled out with CSS or XPath selectors. The technical announcement, with the full credit table and every plan, is on the &lt;a href="https://webfetch.io/blog/webfetch-is-live" rel="noopener noreferrer"&gt;Webfetch blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatible with ScrapingBee
&lt;/h2&gt;

&lt;p&gt;Webfetch takes the parameters, defaults and credit costs of ScrapingBee's HTML API. Code written for ScrapingBee moves over by changing the base URL and the key, unless it depends on AI extraction, &lt;code&gt;scraping_config&lt;/code&gt;, ScrapingBee's dedicated APIs, or screenshots returned as the response body. Response headers change prefix from &lt;code&gt;Spb-&lt;/code&gt; to &lt;code&gt;Wf-&lt;/code&gt;, so code that reads them needs the new prefix. Plans with the same credit allowance cost 38 to 40% less, based on ScrapingBee's published prices on October 8, 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plans and the free tier
&lt;/h2&gt;

&lt;p&gt;Signup confirms a free account with a six-digit code sent to its email address and asks for no card. Free credits start at 1,000, and the 1st of each month adds 250, up to a 1,000 balance. Self-serve plans run from Starter at $11.99 a month for 75,000 credits to Business+ at $359.99 a month for 8,000,000, and Custom plans on dedicated hardware start at $499 a month. Each subscription keeps the monthly price it started at for as long as it stays active.&lt;/p&gt;

&lt;p&gt;Until December 7, 2026, the first 500 new accounts to enter &lt;code&gt;LAUNCH500&lt;/code&gt; at signup get 500 one-time bonus credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a request gets
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Webfetch bills a request only when the target's status is 2xx, 404, 410 or 413. Blocked requests, timeouts, other errors and anti-bot challenge pages cost nothing, even when a challenge page arrives with HTTP 200.&lt;/li&gt;
&lt;li&gt;With &lt;code&gt;mode=auto&lt;/code&gt;, Webfetch starts with the cheapest configuration and moves up after a block, a challenge page, a timeout, a failed connection or render, or a server error, charging for the one attempt that worked.&lt;/li&gt;
&lt;li&gt;Screenshots are captured on Tuxxin's own servers, with &lt;a href="https://webshot.site" rel="noopener noreferrer"&gt;webshot.site&lt;/a&gt;, Tuxxin's screenshot API, as the fallback.&lt;/li&gt;
&lt;li&gt;robots.txt is honored by default, and private and internal network addresses are refused on every request and every redirect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For developers and AI agents
&lt;/h2&gt;

&lt;p&gt;Official SDKs for JavaScript, Python and PHP are on npm, PyPI and Packagist, with the source on &lt;a href="https://github.com/tuxxin/webfetch-sdk" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Webfetch also runs an MCP server at &lt;code&gt;https://webfetch.io/mcp&lt;/code&gt;, so an AI client can fetch a page as markdown or extract structured data with the same API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part of the Tuxxin Stack
&lt;/h2&gt;

&lt;p&gt;Webfetch joins the other services Tuxxin builds and runs, including webshot.site for screenshots, &lt;a href="https://whack.sh" rel="noopener noreferrer"&gt;whack.sh&lt;/a&gt; for URL threat scanning, &lt;a href="https://issued.live" rel="noopener noreferrer"&gt;issued.live&lt;/a&gt; for certificate and DNS data, and &lt;a href="https://worldip.io" rel="noopener noreferrer"&gt;WorldIP.io&lt;/a&gt; for IP intelligence. The &lt;a href="https://tuxxin.com/projects" rel="noopener noreferrer"&gt;projects page&lt;/a&gt; lists all of them, Webfetch included.&lt;/p&gt;

&lt;p&gt;Accounts open at &lt;a href="https://webfetch.io/signup" rel="noopener noreferrer"&gt;webfetch.io/signup&lt;/a&gt;, and the &lt;a href="https://webfetch.io" rel="noopener noreferrer"&gt;home page&lt;/a&gt; runs a real scrape without a key.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>webfetchio</category>
      <category>tuxxinstack</category>
    </item>
    <item>
      <title>How to detect residential proxies with a WorldIP.io beta key</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:44:05 +0000</pubDate>
      <link>https://dev.to/tuxxin/how-to-detect-residential-proxies-with-a-worldipio-beta-key-13i2</link>
      <guid>https://dev.to/tuxxin/how-to-detect-residential-proxies-with-a-worldipio-beta-key-13i2</guid>
      <description>&lt;p&gt;WorldIP.io's paid API plans are planned to launch within the next 30 days. Until then, beta keys to the premium API come with issued.live subscriptions: issued.live Plus, at $99 a month, includes a WorldIP.io Pro key, and issued.live Pro, at $199 a month, includes a WorldIP.io Business key. The Pro key is the tier that detects residential proxies. Each key is emailed within one business day to the address on the issued.live subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to detect residential proxies
&lt;/h2&gt;

&lt;p&gt;A residential proxy network routes traffic out through home internet connections, so its exit addresses belong to ordinary ISPs and pass a datacenter check. WorldIP.io identifies addresses acting as egress nodes for those networks. For one of them, the enriched lookup returns &lt;code&gt;classification.verdict&lt;/code&gt; as &lt;code&gt;residential_proxy&lt;/code&gt; and &lt;code&gt;is_proxy&lt;/code&gt; as &lt;code&gt;true&lt;/code&gt;, with a confidence that fades as the observation ages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://worldip.io/api/v1/ext/lookup/&lt;/span&gt;&lt;span class="nv"&gt;$CLIENT_IP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$WORLDIP_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.classification | {verdict, is_proxy, is_vpn, is_tor, confidence}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the confidence decays, a gate can act on a fresh verdict and treat an old one as a reason for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile proxy detection
&lt;/h2&gt;

&lt;p&gt;Mobile proxy networks do the same through cellular connections, and the same verdict covers them: an egress node for a residential or a mobile proxy network returns &lt;code&gt;residential_proxy&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check if an IP is residential or datacenter
&lt;/h2&gt;

&lt;p&gt;Most home addresses are ordinary connections. For the network type itself, the lookup returns &lt;code&gt;access_type&lt;/code&gt;, and &lt;code&gt;is_datacenter&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; for hosting and cloud ranges. A rule can treat the two signals separately: a datacenter address on a consumer sign-up form, and a residential address flagged as a proxy exit, call for different responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detect iCloud Private Relay
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;is_relay&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; when the address is an Apple iCloud Private Relay egress, and &lt;code&gt;relay_source&lt;/code&gt; names the relay. Private Relay is Apple's iCloud+ privacy service, so a gate can allow it and still record it next to the account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deny sign-ups from proxies
&lt;/h2&gt;

&lt;p&gt;A sign-up or checkout gate needs one call per request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://worldip.io/api/v1/ext/lookup/&lt;/span&gt;&lt;span class="nv"&gt;$CLIENT_IP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$WORLDIP_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.classification | if .is_proxy or .is_vpn or .is_tor then "deny" else "allow" end'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule can be as strict as the form needs: deny detected proxies, send datacenter traffic to review, or allow everything and log the verdict.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the beta keys include
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Pro&lt;/strong&gt; key, normally $39 a month, carries 200,000 enriched lookups a month and 10 concurrent requests: the proxy, VPN, Tor and datacenter classification above, the access type, a trust score from 0 to 100, blocklist hits and basic BGP context, plus city-level geolocation where it exists, ASN type, regional registry ownership, reverse DNS and /24 neighbors.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Business&lt;/strong&gt; key, normally $129 a month, carries 1,000,000 enriched lookups a month and 20 concurrent requests, and adds live BGP prefixes and multiple-origin conflicts, BGP anomaly events through the Pulse API and Web3 node roles.&lt;/p&gt;

&lt;p&gt;Proxy, VPN and Tor detection, the trust score and live BGP cover IPv4 addresses. An IPv6 lookup returns hosting classification, IPv6 blocklists and iCloud Private Relay detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  What issued.live adds
&lt;/h2&gt;

&lt;p&gt;WorldIP.io describes the address: who holds it, how it is routed and what kind of traffic leaves it. issued.live describes what has run at it, from the public Certificate Transparency logs, DNS resolved from seven vantage points and ICANN zone files. Its reverse IP and range lookups list every hostname seen answering at an address, with first-seen and last-seen times, and its certificate and SPKI pivots reach every name on a certificate and every certificate that shares a key. issued.live's guide shows how to &lt;a href="https://issued.live/news/find-domains-in-ip-range" rel="noopener noreferrer"&gt;find domains in an IP range&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;WorldIP.io shows how many domains are hosted on an IPv4 address, on its IP pages and in its keyless API. issued.live lists them. The Tuxxin blog combines the two in &lt;a href="https://tuxxin.com/blog/hunting-adversary-infrastructure" rel="noopener noreferrer"&gt;hunting adversary infrastructure&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terms of the beta key
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who qualifies:&lt;/strong&gt; issued.live Plus and Pro subscribers. issued.live Basic is not included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery:&lt;/strong&gt; by email within one business day, to the address on the issued.live subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration:&lt;/strong&gt; through the beta and for 30 days after WorldIP.io's paid plans launch. The key stays active while the issued.live subscription does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta:&lt;/strong&gt; the monthly quotas above apply, and the beta has no uptime guarantee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits:&lt;/strong&gt; the limits above may change during the beta; key holders are emailed before any change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe on the &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;issued.live pricing page&lt;/a&gt;. Every field is documented in the &lt;a href="https://worldip.io/developers" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>proxydetection</category>
      <category>fraudprevention</category>
      <category>ipintelligence</category>
      <category>residentialproxies</category>
    </item>
  </channel>
</rss>
