<?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: OnaEiuspkz</title>
    <description>The latest articles on DEV Community by OnaEiuspkz (@onaeiuspkz).</description>
    <link>https://dev.to/onaeiuspkz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4127462%2F464d79fd-d761-42c0-8d3e-b8176e27b0c8.png</url>
      <title>DEV Community: OnaEiuspkz</title>
      <link>https://dev.to/onaeiuspkz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/onaeiuspkz"/>
    <language>en</language>
    <item>
      <title>Repeating the Measurement: What Changed Between Two ZoomEye Snapshots</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Wed, 07 Oct 2026 04:00:35 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/repeating-the-measurement-what-changed-between-two-zoomeye-snapshots-42op</link>
      <guid>https://dev.to/onaeiuspkz/repeating-the-measurement-what-changed-between-two-zoomeye-snapshots-42op</guid>
      <description>&lt;h1&gt;
  
  
  Repeating the Measurement: What Changed Between Two ZoomEye Snapshots
&lt;/h1&gt;

&lt;p&gt;ZoomEye queries on 26 September 2026 returned 734,693 matches for app="RabbitMQ", 350,891 for app="Elasticsearch", 257,126 for app="MinIO" and 92,859 for app="Apache ZooKeeper". Each figure is close to a value measured in an earlier collection round without being identical, and those differences are the subject of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context and method
&lt;/h2&gt;

&lt;p&gt;All counts here come from single ZoomEye queries executed through the search API on 26 September 2026 at 00:38 China Standard Time, with page 1, page size 1 and sub_type all. An earlier collection round, run in the same way, produced 735,408 for RabbitMQ, 350,497 for Elasticsearch and 256,552 for MinIO.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why repeated counts differ
&lt;/h2&gt;

&lt;p&gt;An internet-wide scanner measures a moving population. Hosts appear, disappear and change configuration continuously. A service is installed, an address is reassigned, a device is decommissioned, a firewall rule is tightened or loosened. Any second measurement of the same query will differ from the first, and the size of the difference depends on how quickly the underlying population turns over.&lt;br&gt;
That means a difference of a few hundred on a total of hundreds of thousands is not a trend. It is the expected variation between two samples of a dynamic population. Reporting it as growth or decline overstates what a single pair of measurements can show. A trend requires many measurements at consistent intervals, taken the same way, with the query and the vantage points held constant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ZooKeeper comparison
&lt;/h2&gt;

&lt;p&gt;The ZooKeeper figures illustrate a different trap. An earlier article reported 272,927 for ZooKeeper, and the current measurement of app="Apache ZooKeeper" returned 92,859. Those two numbers are not comparable, and the query itself is the reason. A dork that names the product with a different spelling, or that matches a field such as a banner instead of a product label, describes a different set of hosts.&lt;br&gt;
The lesson generalises. Before treating two numbers as a change over time, confirm that the queries were identical. Dork syntax, field selection, sub_type and case sensitivity all affect the result, and the fuzzy and exact match operators behave differently. A count without its query text is not reproducible, and an unreproducible count cannot support a trend claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers do support
&lt;/h2&gt;

&lt;p&gt;They support a statement about scale at a moment in time. RabbitMQ with more than seven hundred thousand matches, Elasticsearch above three hundred fifty thousand, MinIO above two hundred fifty thousand and ZooKeeper approaching one hundred thousand describe an internet in which message brokers, search clusters and object storage endpoints are widely reachable.&lt;br&gt;
For each of these four, the operational question is the same and does not depend on the exact count. Is the service reachable from outside the network that uses it, and is authentication enabled? RabbitMQ and Elasticsearch both support authentication and both have long histories of deployments found without it. MinIO requires credentials for its interface, but exposed consoles still disclose the existence and often the naming convention of the buckets behind them. ZooKeeper was designed for trusted networks and authenticates clients optionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implications and next steps
&lt;/h2&gt;

&lt;p&gt;Record the query text alongside every count, and record the collection time and the sub_type parameter. A number without that context cannot be compared to a later reading, and the comparison is the only thing that turns a measurement into intelligence.&lt;br&gt;
Set a variation threshold before drawing conclusions. For a population in the hundreds of thousands, differences of a fraction of a percent over days are noise. Decide what magnitude would indicate a real change, and only then treat a reading as a signal.&lt;br&gt;
Then use the counts for what they support. They establish that a technology is widely reachable and therefore worth a configuration review. The review itself happens inside the network, against an inventory, and the internet scan only tells you which technologies to look for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope and limitations
&lt;/h2&gt;

&lt;p&gt;These are point-in-time fingerprint counts from ZoomEye's vantage points. They include cloud provider ranges, research networks and honeypot hosts, and they count each reachable node separately, so a single deployment contributes multiple matches. Variations between collection rounds reflect the dynamics of the public internet and the behaviour of the scanner as well as real changes. Nothing here measures exploitation or patching status.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ZoomEye search API results for app="RabbitMQ", app="Elasticsearch", app="MinIO" and app="Apache ZooKeeper", collected 26 September 2026.&lt;/li&gt;
&lt;li&gt;Earlier collection round results for the equivalent dorks, used only for comparison.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zoomeye</category>
      <category>measurement</category>
      <category>rabbitmq</category>
      <category>elasticsearch</category>
    </item>
    <item>
      <title>Finding WordPress Click2Shell Exposure Starts With Knowing Where WordPress Runs</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Wed, 07 Oct 2026 01:40:34 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/finding-wordpress-click2shell-exposure-starts-with-knowing-where-wordpress-runs-2kpb</link>
      <guid>https://dev.to/onaeiuspkz/finding-wordpress-click2shell-exposure-starts-with-knowing-where-wordpress-runs-2kpb</guid>
      <description>&lt;h1&gt;
  
  
  Finding WordPress Click2Shell Exposure Starts With Knowing Where WordPress Runs
&lt;/h1&gt;

&lt;p&gt;On September 21, 2026, security researchers disclosed Click2Shell, an unauthenticated remote code execution chain in WordPress Core. An attacker needs no WordPress account. A single visit by a logged-in administrator to a crafted link is enough: the browser installs a catalog theme on its own, and the theme's unprotected AJAX endpoint downloads and executes attacker-controlled PHP. WordPress fixed the core parser flaw in version 7.1.1. No CVE identifier has been published yet, and researchers confirmed no exploitation in the wild at disclosure time.&lt;br&gt;
Before any team can prioritize this fix, it needs an answer to a simpler question: where does WordPress actually run in the environment we are responsible for?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why inventory comes first
&lt;/h2&gt;

&lt;p&gt;WordPress is famously large. A ZoomEye query for &lt;code&gt;app="WordPress"&lt;/code&gt;, executed on September 22, 2026 (UTC), returned 7,945,496 matching assets worldwide. That number counts indexed WordPress product assets. It does not mean those hosts are vulnerable, and it does not mean they were attacked. What it does show is scale: any WordPress Core flaw touches an asset population too large to handle by memory or spreadsheet.&lt;br&gt;
For an organization, the relevant subset is smaller. WordPress instances behind the corporate perimeter, on partner-facing hosts, or on forgotten staging servers all count. The Click2Shell chain makes forgotten instances especially interesting, because the attack path runs through an administrator's browser session rather than through obvious network exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ZoomEye can and cannot verify here
&lt;/h2&gt;

&lt;p&gt;ZoomEye's role in this event is verifiable asset discovery, not vulnerability confirmation. The fingerprint query &lt;code&gt;app="WordPress"&lt;/code&gt; identifies hosts presenting WordPress signals. Teams can narrow it with geographic or network filters that match their own scope, for example combining the product fingerprint with a known ASN or CIDR to spot instances registered to their address space that never entered the CMDB.&lt;br&gt;
Three limits deserve explicit statement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A matching asset is not a confirmed vulnerable asset. The core parser weakness affects versions before 7.1.1, but ZoomEye's product fingerprint does not, by itself, prove a specific patch level.&lt;/li&gt;
&lt;li&gt;The count is a point-in-time observation. The 7.9 million figure was collected on 2026-09-22 and will drift as indexing continues.&lt;/li&gt;
&lt;li&gt;The theme-side flaw (Mobile Repair Zone 2.5.4 and over 40 other catalog themes) lives inside third-party packages that a product-level fingerprint cannot see.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A defensible first step
&lt;/h2&gt;

&lt;p&gt;For the Click2Shell event, asset identification is the step that makes every later step possible: patch tracking needs a host list, theme audits need an installation list, and incident review needs a scope. A ZoomEye product query, recorded with its query string, execution time and total, gives teams a documented starting point they can repeat and compare over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SecurityOnline.info, "WordPress Click2Shell Vulnerability Triggers Core RCE, PoC Published", September 21, 2026.&lt;/li&gt;
&lt;li&gt;pwn.ai research report on the Click2Shell chain, as cited by the source article.&lt;/li&gt;
&lt;li&gt;ZoomEye query record: &lt;code&gt;app="WordPress"&lt;/code&gt;, 2026-09-22, 7,945,496 results.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>click2shell</category>
      <category>zoomeye</category>
      <category>rce</category>
    </item>
    <item>
      <title>Apache NiFi at 6,093 observed hosts: a data flow controller and the credentials it holds</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 19:00:32 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/apache-nifi-at-6093-observed-hosts-a-data-flow-controller-and-the-credentials-it-holds-1o39</link>
      <guid>https://dev.to/onaeiuspkz/apache-nifi-at-6093-observed-hosts-a-data-flow-controller-and-the-credentials-it-holds-1o39</guid>
      <description>&lt;h2&gt;
  
  
  The number
&lt;/h2&gt;

&lt;p&gt;A ZoomEye query for &lt;code&gt;app="Apache NiFi"&lt;/code&gt; returned 6,093 matching hosts, collected on 2 October 2026 with sub_type=all and a page size of one record. The total is the match count for the fingerprint. A smaller figure than the monitoring or observability products, and one that still deserves attention because of what the software does rather than how many instances run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NiFi represents
&lt;/h2&gt;

&lt;p&gt;NiFi moves data between systems. A flow is a graph of processors that read from a source, transform the payload and write to a destination. To do that it stores connection details for every system at both ends of the flow, and the flow configuration therefore contains credentials for databases, message brokers, object stores and APIs.&lt;/p&gt;

&lt;p&gt;The interface also supports building and running flows, which means an authenticated session can redirect where data goes. The distinction between reading the configuration and acting on it is the difference between a disclosure and a data exfiltration path, and the software provides both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the count does not say
&lt;/h2&gt;

&lt;p&gt;6,093 hosts identify as NiFi. It does not say how many allow anonymous access or use a default credential, how many sit behind a single sign-on proxy, or how many are development instances with synthetic data. NiFi's own configuration includes a setting that permits anonymous access, and its documentation describes the single-user and multi-user modes, so the answer depends on which mode each deployment chose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the exposure matters
&lt;/h2&gt;

&lt;p&gt;A flow configuration is a map of an organisation's data movement, and the parameters in it include the endpoints, the topics, the bucket names and the credentials. Even without the ability to modify a flow, reading the configuration narrows a large environment to the systems that matter. With the ability to write one, a new processor can send data to an address of the attacker's choosing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;Require authentication and remove anonymous access deliberately rather than by default assumption. Put the interface behind a network control or a proxy that enforces authentication, and check that the registration or single sign-on configuration is the intended one rather than the sample configuration shipped in a tutorial.&lt;/p&gt;

&lt;p&gt;Review the flow parameters that contain credentials and consider moving them to a controller service with a protected type, so that reading a flow does not read a secret. Restrict the interface to the operator network, and record which accounts can modify flows as opposed to viewing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Apache NiFi documentation. &lt;a href="https://nifi.apache.org/docs.html" rel="noopener noreferrer"&gt;https://nifi.apache.org/docs.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ZoomEye. &lt;a href="https://www.zoomeye.ai/" rel="noopener noreferrer"&gt;https://www.zoomeye.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>zoomeye</category>
      <category>datapipeline</category>
      <category>exposure</category>
    </item>
    <item>
      <title>Plane at three fields and three answers: 12,510 titles, 358 fingerprints and 72 product matches</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 18:40:32 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/plane-at-three-fields-and-three-answers-12510-titles-358-fingerprints-and-72-product-matches-57i</link>
      <guid>https://dev.to/onaeiuspkz/plane-at-three-fields-and-three-answers-12510-titles-358-fingerprints-and-72-product-matches-57i</guid>
      <description>&lt;h1&gt;
  
  
  Plane at three fields and three answers: 12,510 titles, 358 fingerprints and 72 product matches
&lt;/h1&gt;

&lt;p&gt;When three fields return three different numbers for one product, the instinct is to look for the correct one. For Plane, a project management platform, the more useful response is to establish what question each field answers and to stop treating them as competing estimates of one quantity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context and method
&lt;/h2&gt;

&lt;p&gt;Queries ran through the ZoomEye SDK on 2026-10-05 with sub_type=all, page=1 and pagesize=1. Page size limits returned records, not matched totals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search: title="Plane" returned 12,510.&lt;/li&gt;
&lt;li&gt;Comparison: app="Plane" returned 358.&lt;/li&gt;
&lt;li&gt;Comparison: product="Plane" returned 72.
All three figures describe globally indexed assets at collection time. None indicates that a workspace is reachable, unauthenticated or vulnerable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What separates the numbers
&lt;/h2&gt;

&lt;p&gt;The title figure is the most permissive of the three, and for a short and common word it is also the least precise. A product name that can appear as an ordinary noun will accumulate matches from pages where the word is used for other reasons, which is a specific hazard here that was not a factor for the longer product names measured elsewhere in this series.&lt;br&gt;
The application field is stricter, since it depends on recognisable behaviour rather than on a string. Its value is the most plausible population indicator of the three, subject to the usual caveat that client-rendered interfaces reduce coverage.&lt;br&gt;
The product field reflects a component-level representation that covers some application classes and not others. As with other products measured in this series, a value one or two orders of magnitude below the fingerprint count is a coverage statement rather than a deployment statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the platform is worth reviewing
&lt;/h2&gt;

&lt;p&gt;A project management platform holds the organisation's plans, issue descriptions, attachments and, in many deployments, the integrations that connect it to source control, chat and automation. The integration credentials are the sensitive part: a task tracker that can post to a chat channel, merge a pull request or trigger a deployment is a system with standing authority, and its own authentication is the only barrier in front of that authority.&lt;br&gt;
Public projects add a second dimension. Where a workspace has published projects for external visibility, the same application serves both an intentionally public surface and a private one, and the distinction depends on configuration that an external observer cannot verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reporting method
&lt;/h2&gt;

&lt;p&gt;Report each field with its query and collection time, and describe what it measures rather than ranking the three into one figure. Where a product name is a common word, state that the title field over-collects and prefer the fingerprint field for population questions. Where the fingerprint field returns a very small number for a widely deployed product, state that the field does not cover the application class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;This is a single collection, and the three figures are not directly comparable to counts gathered under a different sub_type. No claim is made about the security posture of any deployment. The title field in particular should not be used for trend analysis for a name of this kind.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ZoomEye, title="Plane" (12,510), app="Plane" (358) and product="Plane" (72), sub_type=all, collected 2026-10-05.&lt;/li&gt;
&lt;li&gt;Plane project documentation, workspace and integration configuration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zoomeye</category>
      <category>measurement</category>
      <category>projectmanagement</category>
    </item>
    <item>
      <title>Metabase on 116,913 observed hosts: business intelligence as an unguarded data path</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 15:20:31 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/metabase-on-116913-observed-hosts-business-intelligence-as-an-unguarded-data-path-3085</link>
      <guid>https://dev.to/onaeiuspkz/metabase-on-116913-observed-hosts-business-intelligence-as-an-unguarded-data-path-3085</guid>
      <description>&lt;h2&gt;
  
  
  The number
&lt;/h2&gt;

&lt;p&gt;A ZoomEye query for &lt;code&gt;app="Metabase"&lt;/code&gt; returned 116,913 matching hosts, collected on 2 October 2026 with sub_type=all and a page size of one. The count is the fingerprint match total. Business intelligence platforms appear in large numbers because they are easy to deploy and often land on a shared host with a memorable address.&lt;/p&gt;

&lt;p&gt;Metabase connects to databases with a stored connection, and the questions and dashboards it renders are SQL that runs against those databases. The application is therefore an authenticated proxy to every connected data source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the surface exposes
&lt;/h2&gt;

&lt;p&gt;An installation that has completed first-run setup presents a login. An installation that has not presents a setup page that creates the first administrator, which is the case worth searching for because it converts an exposed instance into full control of the connected databases.&lt;/p&gt;

&lt;p&gt;Beyond that, the public sharing feature allows a question or dashboard to be published at a link without authentication, and the feature is enabled by default unless it has been turned off. A shared link reveals whatever the underlying query returns, including data the sharing administrator may not have considered sensitive when the link was created.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the count does not say
&lt;/h2&gt;

&lt;p&gt;116,913 hosts identify as Metabase. It does not say how many have completed setup, how many have public sharing enabled, or how many databases each can reach. Those are per-instance facts, and they are exactly the facts a defender should collect internally rather than infer from a scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the exposure matters
&lt;/h2&gt;

&lt;p&gt;The platform concentrates database credentials in one place and presents them through an interface designed for ease of use. Database connections are frequently created with administrative or read-all accounts because that is the path of least resistance during a trial. A single account takeover therefore reads any table the connected account can read, and the list of connected accounts is visible in the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;Disable public sharing where it is not required, and review existing share links for content that has changed meaning since publication. Review the database connections and replace broad accounts with roles limited to the tables the platform actually serves.&lt;/p&gt;

&lt;p&gt;Require authentication through the platform or an upstream proxy, keep the instance on an internal network, and check whether the setup flow has been completed on every deployment rather than only the primary one. Where several copies exist for testing, treat them as in scope, because a test copy usually carries a copy of the production connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Metabase documentation. &lt;a href="https://www.metabase.com/docs/latest/" rel="noopener noreferrer"&gt;https://www.metabase.com/docs/latest/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ZoomEye. &lt;a href="https://www.zoomeye.ai/" rel="noopener noreferrer"&gt;https://www.zoomeye.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>zoomeye</category>
      <category>analytics</category>
      <category>exposure</category>
    </item>
    <item>
      <title>After CVE-2026-104286: A Compromise Assessment Plan for FortiMail</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 03:40:31 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/after-cve-2026-104286-a-compromise-assessment-plan-for-fortimail-55ap</link>
      <guid>https://dev.to/onaeiuspkz/after-cve-2026-104286-a-compromise-assessment-plan-for-fortimail-55ap</guid>
      <description>&lt;h1&gt;
  
  
  After CVE-2026-104286: A Compromise Assessment Plan for FortiMail
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Start from the exploitation window
&lt;/h2&gt;

&lt;p&gt;CVE-2026-104286 is a CVSS 9.8 path traversal in Fortinet FortiMail that allows unauthenticated file writes through crafted HTTP or HTTPS requests. Fortinet reports exploitation in the wild, and CISA added the issue to its Known Exploited Vulnerabilities catalog on October 1, 2026.&lt;/p&gt;

&lt;p&gt;If the management interface was internet-reachable, assume the window applies and investigate rather than assuming safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  High-value checks
&lt;/h2&gt;

&lt;p&gt;Review the appliance for modified binaries and unexpected library preloads. Check whether files exist in directories the application does not normally write to, and whether configuration changed outside a recorded change. Compare current state against a known-good baseline where one exists.&lt;/p&gt;

&lt;p&gt;On the network side, look for outbound connections to hosts the appliance has no business contacting. Mail gateways legitimately talk to many destinations, so baseline the expected set first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling a confirmed compromise
&lt;/h2&gt;

&lt;p&gt;Treat it as a containment event. Isolate the appliance, preserve evidence for analysis, and rebuild from a trusted image rather than cleaning in place. Rotate credentials the appliance held, and review mail flow rules for unauthorized changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Close the loop
&lt;/h2&gt;

&lt;p&gt;Document what was checked and what was found. That record supports both a defensible conclusion and a faster response if a related Fortinet advisory appears later. Full remediation still means upgrading to a fixed build and migrating off the 7.0 branch, which has no named fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fortinet PSIRT advisory FG-IR-26-175 covering CVE-2026-104286.&lt;/li&gt;
&lt;li&gt;CISA alert, "CISA Adds One Known Exploited Vulnerability to Catalog," October 1, 2026: &lt;a href="https://www.cisa.gov/news-events/alerts/2026/10/01/cisa-adds-one-known-exploited-vulnerability-catalog" rel="noopener noreferrer"&gt;https://www.cisa.gov/news-events/alerts/2026/10/01/cisa-adds-one-known-exploited-vulnerability-catalog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CVE.org entry: &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-104286" rel="noopener noreferrer"&gt;https://www.cve.org/CVERecord?id=CVE-2026-104286&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;securityonline.info report: &lt;a href="https://securityonline.info/fortimail-vulnerability-cve-2026-104286/" rel="noopener noreferrer"&gt;https://securityonline.info/fortimail-vulnerability-cve-2026-104286/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vulnerability</category>
      <category>fortinet</category>
      <category>fortimail</category>
      <category>cve2026104286</category>
    </item>
    <item>
      <title>CVE-2026-65660: a SharePoint code injection reachable with an ordinary user account</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Tue, 06 Oct 2026 01:20:31 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/cve-2026-65660-a-sharepoint-code-injection-reachable-with-an-ordinary-user-account-31jm</link>
      <guid>https://dev.to/onaeiuspkz/cve-2026-65660-a-sharepoint-code-injection-reachable-with-an-ordinary-user-account-31jm</guid>
      <description>&lt;h1&gt;
  
  
  CVE-2026-65660: a SharePoint code injection reachable with an ordinary user account
&lt;/h1&gt;

&lt;p&gt;SharePoint is rarely treated as a perimeter system, which is why a flaw in it reads as lower priority than an edge appliance. CVE-2026-65660 changes that calculus. The vulnerability is a code injection in Microsoft SharePoint Server, added to the KEV catalog after exploitation was observed, and it is reachable by an authenticated user with low privileges.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the flaw is
&lt;/h2&gt;

&lt;p&gt;The vulnerability is a code injection in SharePoint Server. The distinction from a remote unauthenticated flaw is important: the attacker needs an account, which means the entry point is more likely to be a phished credential, a contractor account, or a service account that was left with interactive access than a mass scanning campaign.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an authenticated flaw is still a serious one
&lt;/h2&gt;

&lt;p&gt;An attacker with a valid low-privilege account already has what a scanner does not: a legitimate session, a valid audit trail, and the ability to reach internal resources that are not exposed to the internet. In a document management platform the account can create content, and content is processed by other users and by server-side components.&lt;br&gt;
Detection also suffers. Requests from an authenticated user sit inside normal traffic, so the signal is behavioural rather than structural. A spike in requests to server-side component paths from one account, or requests that arrive outside that account's normal working pattern, is closer to what an investigation can actually use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why document platforms keep producing injection bugs
&lt;/h2&gt;

&lt;p&gt;A collaboration platform is a set of server-side renderers, converters and web parts assembled over many years, and each of them accepts structured input. Code injection tends to appear where a component builds executable content from data that a user supplied, and where the boundary between data and code is defined by convention rather than enforced by the runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;Apply Microsoft's updates for the affected SharePoint Server versions. Confirm which farms are still in scope, since SharePoint estates commonly include older farms that were kept for a single application.&lt;br&gt;
Given confirmed exploitation, presume the entry point was a real account and review it. Look at authentication events for accounts with privileges well beyond their role, at new site collections and web parts created recently, and at outbound connections from SharePoint servers to destinations that are not part of normal integration traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;iThome weekly security roundup, 2 October 2026, &lt;a href="https://www.ithome.com.tw/news/179381" rel="noopener noreferrer"&gt;https://www.ithome.com.tw/news/179381&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Daily security intelligence report, 1 October 2026, &lt;a href="https://blog.csdn.net/weixin_45635831/article/details/166945207" rel="noopener noreferrer"&gt;https://blog.csdn.net/weixin_45635831/article/details/166945207&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>microsoft</category>
      <category>codeinjection</category>
      <category>collaboration</category>
    </item>
    <item>
      <title>Rancher on 23,600 observed hosts: a management console with credentials for many clusters</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Mon, 05 Oct 2026 18:40:29 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/rancher-on-23600-observed-hosts-a-management-console-with-credentials-for-many-clusters-4hd8</link>
      <guid>https://dev.to/onaeiuspkz/rancher-on-23600-observed-hosts-a-management-console-with-credentials-for-many-clusters-4hd8</guid>
      <description>&lt;h1&gt;
  
  
  Rancher on 23,600 observed hosts: a management console with credentials for many clusters
&lt;/h1&gt;

&lt;p&gt;A ZoomEye fingerprint query for app="Rancher" (&lt;a href="https://www.zoomeye.ai/searchResult?q=YXBwPSJSYW5jaGVyIg%3D%3D" rel="noopener noreferrer"&gt;result list&lt;/a&gt;) returned 23,600 matching hosts at collection time, with sub_type=all, page 1 and page size 1. Rancher is a Kubernetes management platform, and the relatively modest count fits a product that is usually deployed inside an organisation rather than on a public address.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the console holds
&lt;/h2&gt;

&lt;p&gt;Rancher manages clusters rather than running application workloads directly. The web interface listens on 443 by default, with the original HTTP port 80 available for redirects. A Rancher server stores the credentials it uses to talk to every managed cluster, along with user accounts, roles and project assignments. That is a centralised trust store by design, and it is the reason the console is a high value target: an attacker who reaches it with valid credentials can act across the whole estate, and an attacker who finds an authentication weakness inherits the same reach.&lt;/p&gt;

&lt;p&gt;Historically the product shipped with a bootstrap password that had to be set on first login. Deployments that were stood up in a hurry and never finished that step are the ones where a default credential can still work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checks for operators
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm that the bootstrap admin account has been rotated, and that multi-factor authentication is required for accounts with cluster-wide privileges.&lt;/li&gt;
&lt;li&gt;Keep the console on an administrative network and avoid publishing it to the internet, even on a non-standard port.&lt;/li&gt;
&lt;li&gt;Review the external authentication configuration, since a misconfigured provider can widen access beyond the group that was intended.&lt;/li&gt;
&lt;li&gt;Watch the audit log for cluster registration events and role changes that no change record explains.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the count supports
&lt;/h2&gt;

&lt;p&gt;A fingerprint match indicates that a host looks like a Rancher server. It does not confirm reachability, credential state or the number of clusters behind it. The value of the number is in the question it raises: whether any management console in your estate is reachable from a network that the console was never meant to serve.&lt;/p&gt;

</description>
      <category>attacksurface</category>
      <category>zoomeye</category>
      <category>rancher</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Subdomain Takeover: The Dangling Record That Keeps Handing Out Your Brand</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Mon, 05 Oct 2026 18:20:29 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/subdomain-takeover-the-dangling-record-that-keeps-handing-out-your-brand-20m1</link>
      <guid>https://dev.to/onaeiuspkz/subdomain-takeover-the-dangling-record-that-keeps-handing-out-your-brand-20m1</guid>
      <description>&lt;h1&gt;
  
  
  Subdomain Takeover: The Dangling Record That Keeps Handing Out Your Brand
&lt;/h1&gt;

&lt;p&gt;A subdomain takeover is one of the few vulnerabilities that a defender can confirm without touching the target. The DNS record is public. If it points at a third-party service that no longer claims the name, anyone who can register that name at the same provider gets the subdomain, and with it the trust the parent domain extends.&lt;br&gt;
The finding is unglamorous and persistent. It survives domain migrations, marketing campaigns, and reorganisation, because the record lives in a zone file and the service lives in someone else's account, and no single person owns both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mechanism, plainly
&lt;/h2&gt;

&lt;p&gt;An organisation points &lt;code&gt;something.example.com&lt;/code&gt; at a third-party host, typically by creating a CNAME to a provider-assigned hostname. That is the standard way to serve a marketing site, a help centre, a status page, or a project preview.&lt;br&gt;
The service is later decommissioned. The team deletes the content at the provider, or the account lapses, or the subscription is cancelled. The DNS record remains, because it was created by a different team through a different process.&lt;br&gt;
The provider's hostname is now unclaimed. Many providers assign hostnames that are derived from a project name or a slug, and when the original claim is released, a new account can claim the same name. The new account holder now answers for &lt;code&gt;something.example.com&lt;/code&gt;.&lt;br&gt;
The impact depends on what the parent domain trusts. Cookies scoped to the parent domain can be set by the taken-over host, which is why cookie prefixes matter. Email authentication records may align against the parent domain. Content served from the subdomain inherits the brand, which is what makes it useful for phishing or for hosting payloads that security controls treat as first-party.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding them without an agent
&lt;/h2&gt;

&lt;p&gt;The discovery method is entirely passive, which is what makes it worth doing on a schedule.&lt;br&gt;
Enumerate the subdomains of the domains you own. Public certificate transparency logs are a rich source, because every certificate issued for a subdomain is logged. Passive DNS sources and your own resolver logs add names that certificates miss.&lt;br&gt;
Resolve each name and record where it points. For each CNAME, compare the target against a maintained list of provider patterns and their released-name fingerprints. The fingerprint is usually the provider's own error page or a specific HTTP response, and the pattern list is worth maintaining as a data file rather than in someone's memory.&lt;br&gt;
Charge the record to a verification step, not to a finding. A CNAME that points at a live, claimed service is not a takeover; it is normal. The distinguishing evidence is that the provider does not recognise the name and the content it serves is not yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with one-time scans
&lt;/h2&gt;

&lt;p&gt;A takeover scan answers today's question. The records that matter are the ones that appear between scans.&lt;br&gt;
The durable approach is to own the record lifecycle. Every DNS record that points at a third-party service should have an owner and a purpose attached to it, and the decommissioning process for that service should include the DNS record. The failure is not that the scan did not run. It is that nobody was accountable for the record when the service ended.&lt;br&gt;
Where the zone is large and the ownership is unclear, the practical alternative is continuous discovery with alerting. Certificates are still issued for subdomains you may not know about, and a new CNAME is a leading indicator of a new unmapped dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controls that reduce the blast radius
&lt;/h2&gt;

&lt;p&gt;Three controls make a takeover less useful even if it happens.&lt;br&gt;
Set session cookies with the &lt;code&gt;__Host-&lt;/code&gt; prefix, which restricts the cookie to the exact host and prevents a sibling subdomain from setting a cookie scoped to the parent domain.&lt;br&gt;
Keep email sending domains and the primary domain separated where the mail architecture allows it, so that a subdomain failure does not undermine alignment.&lt;br&gt;
Monitor what is served from your subdomains. A takeover changes content, and the change is visible before anyone reports a phishing page that uses your brand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to take away
&lt;/h2&gt;

&lt;p&gt;Subdomain takeover is a lifecycle failure with a technical symptom. The scan is cheap and should run continuously, but the fix is an inventory in which every record that delegates trust to a third party has an owner and a removal step. The finding to act on is not "we have a dangling CNAME." It is "we did not know this dependency existed."&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OWASP, &lt;a href="https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/10-Test_for_Subdomain_Takeover" rel="noopener noreferrer"&gt;Subdomain Takeover&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MITRE ATT&amp;amp;CK, &lt;a href="https://attack.mitre.org/techniques/T1584/001/" rel="noopener noreferrer"&gt;T1584.001: Compromise Infrastructure - Domains&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;RFC Editor, &lt;a href="https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis" rel="noopener noreferrer"&gt;RFC 6265bis: Cookies (__Host- prefix)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Certificate Transparency, &lt;a href="https://crt.sh/" rel="noopener noreferrer"&gt;CT log search&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>websecurity</category>
      <category>dns</category>
      <category>assetmanagement</category>
    </item>
    <item>
      <title>Auditing file-serving permission checks, using CVE-2026-100727 as the model</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:00:37 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/auditing-file-serving-permission-checks-using-cve-2026-100727-as-the-model-544h</link>
      <guid>https://dev.to/onaeiuspkz/auditing-file-serving-permission-checks-using-cve-2026-100727-as-the-model-544h</guid>
      <description>&lt;h1&gt;
  
  
  Auditing file-serving permission checks, using CVE-2026-100727 as the model
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Why this audit is worth running
&lt;/h2&gt;

&lt;p&gt;CVE-2026-100727 affects GROWI versions before v7.5.5 and allows a remote unauthenticated attacker to read files contained in non-public pages when the file upload setting is configured as "Local". The advisory JVN#24352487 classifies it as CWE-552 and scores it 6.9 on CVSS 4.0 and 5.3 on CVSS 3.0. The vendor fixed it in version 7.5.5, released on 2026/10/05, after a coordinated report through JPCERT/CC.&lt;br&gt;
The GROWI case is a clean example of a class of bug that appears across many platforms: an application applies a permission check to the page and a weaker one, or none, to the stored file the page references. Reviewing for that pattern is cheap compared with discovering it through an incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check that matters
&lt;/h2&gt;

&lt;p&gt;For every endpoint that returns stored bytes, ask which permission decision gates it and which object that decision is evaluated against. The correct answer names the owning record, not the storage path. A path-based check answers a different question, namely whether the requester can name the object, and naming an object is not an authorisation decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the pattern hides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Static file routes registered outside the application's request pipeline, which never pass through the middleware that carries the session&lt;/li&gt;
&lt;li&gt;Download endpoints that accept an object identifier and read it directly&lt;/li&gt;
&lt;li&gt;Signed-URL features whose signature covers the path but not the current permission state, so a link stays valid after the owner revokes access&lt;/li&gt;
&lt;li&gt;Attachment rendering inside editors, which may fetch referenced files through a separate handler&lt;/li&gt;
&lt;li&gt;Archived or exported content bundles that reproduce the original paths without the original checks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A repeatable review
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enumerate every route that can return file-like content, including routes mounted by libraries and by static handlers.&lt;/li&gt;
&lt;li&gt;For each route, record the gating decision and the object that decision reads.&lt;/li&gt;
&lt;li&gt;Compare that object with the object the user interface protects.&lt;/li&gt;
&lt;li&gt;Test anonymously against a private-page attachment and record the outcome.&lt;/li&gt;
&lt;li&gt;Repeat the test after each upgrade that changes file handling, since a refactor can move the gate without removing it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Affected products and scope
&lt;/h2&gt;

&lt;p&gt;For this CVE specifically, the affected combination is GROWI before v7.5.5 with the file upload setting configured as "Local". Other platforms require their own mapping of the check to the endpoint, and the review method above applies to them without modification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exposure context
&lt;/h2&gt;

&lt;p&gt;On 2026-10-05 a ZoomEye query for hosts that display the product name in the page title returned 401 records:&lt;br&gt;
Search Dork: &lt;code&gt;title="GROWI"&lt;/code&gt;&lt;br&gt;
The figure describes product surfaces, not vulnerable instances, and it cannot report which upload backend each host uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remediation and mitigations
&lt;/h2&gt;

&lt;p&gt;Patch to GROWI v7.5.5. Confirm the fix by testing the anonymous request path. Where local storage remains in use, treat it as a configuration to verify after every future upgrade, and keep the attachment inventory current so a disclosure window can be scoped quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jvn.jp/en/jp/JVN24352487/index.html" rel="noopener noreferrer"&gt;JVN#24352487: GROWI vulnerable to improper access control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jvndb.jvn.jp/en/contents/2026/JVNDB-2026-000144.html" rel="noopener noreferrer"&gt;JVN iPedia: JVNDB-2026-000144&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-100727" rel="noopener noreferrer"&gt;CVE-2026-100727 record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/growilabs/growi/releases" rel="noopener noreferrer"&gt;GROWI release notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>Server-side request forgery: the redirect that walks past your allowlist</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:20:30 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/server-side-request-forgery-the-redirect-that-walks-past-your-allowlist-4aoa</link>
      <guid>https://dev.to/onaeiuspkz/server-side-request-forgery-the-redirect-that-walks-past-your-allowlist-4aoa</guid>
      <description>&lt;h1&gt;
  
  
  Server-side request forgery: the redirect that walks past your allowlist
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What makes SSRF resilient
&lt;/h2&gt;

&lt;p&gt;A server that fetches a URL supplied by a user is making the request from a position of trust. The classic outcome is access to an internal service, and the modern high-value target is the cloud instance metadata endpoint, which on many platforms answers on the link-local address 169.254.169.254. The metadata service hands out temporary credentials to anything that asks from the instance, which turns one HTTP request into control of the workload's cloud identity.&lt;/p&gt;

&lt;p&gt;The reason simple filtering fails is that the attacker chooses the redirect chain as well as the first URL. A fetched resource can answer with a redirect to an address the allowlist would have rejected, and a client that follows redirects automatically has already made the request by the time any check runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why allowlists still win, and where they leak
&lt;/h2&gt;

&lt;p&gt;OWASP's guidance puts allowlists first, and the reasoning holds: the set of destinations a feature legitimately needs is almost always small and enumerable. A denylist has to anticipate every representation of an internal address, including decimal, octal and hexadecimal forms, IPv6 mapped forms, and DNS names that resolve to internal addresses after the check.&lt;/p&gt;

&lt;p&gt;The leak is the gap between the check and the use. If the address is validated once and the request is then made by a client that resolves the name a second time, a DNS record that changes between the two lookups defeats the validation. If the client follows redirects, the validation applies to the first hop only. Both are time-of-check to time-of-use problems, and both are fixed by validating at the point of use.&lt;/p&gt;

&lt;h2&gt;
  
  
  A design that holds
&lt;/h2&gt;

&lt;p&gt;Resolve the name, validate the resulting address, and connect to that address directly rather than to the name. Disable automatic redirect following and handle redirects explicitly, revalidating each hop against the same rules. Restrict the scheme to HTTPS and set a short timeout. Where the fetch can reach a metadata endpoint, use the platform control: on AWS, IMDSv2 requires a session token that a simple SSRF cannot obtain, and lowering the hop limit restricts which processes on the instance can reach the service.&lt;/p&gt;

&lt;p&gt;Where the feature only needs to fetch from a known set of hosts, replace URL input with a host identifier and build the URL from a template. That removes attacker control over the destination entirely and is the only design with no bypass class of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;Send a request that points at the metadata address directly and confirm it is refused. Then send a request that points at a controlled external host that responds with a redirect to the metadata address, and confirm the redirect is either refused or revalidated. The second test is the one that finds the gap, and it is cheap to run whenever the fetch code changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Server-Side Request Forgery Prevention Cheat Sheet, OWASP. &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configure the instance metadata service, Amazon EC2 User Guide. &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;RFC 9110, HTTP Semantics. &lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html" rel="noopener noreferrer"&gt;https://www.rfc-editor.org/rfc/rfc9110.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ssrf</category>
      <category>web</category>
      <category>cloud</category>
    </item>
    <item>
      <title>oc-mirror CVE-2026-75939: A Signature Check That Runs in the Wrong Order</title>
      <dc:creator>OnaEiuspkz</dc:creator>
      <pubDate>Mon, 05 Oct 2026 01:00:29 +0000</pubDate>
      <link>https://dev.to/onaeiuspkz/oc-mirror-cve-2026-75939-a-signature-check-that-runs-in-the-wrong-order-260f</link>
      <guid>https://dev.to/onaeiuspkz/oc-mirror-cve-2026-75939-a-signature-check-that-runs-in-the-wrong-order-260f</guid>
      <description>&lt;h1&gt;
  
  
  oc-mirror CVE-2026-75939: A Signature Check That Runs in the Wrong Order
&lt;/h1&gt;

&lt;p&gt;Red Hat disclosed CVE-2026-75939 on 21 September 2026 with a CVSS v3.1 score of 7.4. The affected component is &lt;code&gt;openshift4/oc-mirror-plugin-rhel9&lt;/code&gt; in Red Hat OpenShift Container Platform 4. The tool that syncs release images, operator catalogs and related content into a private registry can be made to accept a forged PGP message, and the defect is one of ordering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The logic error
&lt;/h2&gt;

&lt;p&gt;According to the vendor advisory, oc-mirror has a validation order defect when processing PGP-signed release images. The tool performs the signature error check before it has finished processing the full signed message body. A forged PGP message that carries a legitimate Red Hat release key id can therefore be judged trustworthy, because the check is completed on incomplete input.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an attacker needs and gains
&lt;/h2&gt;

&lt;p&gt;Exploitation requires the ability to intercept or modify traffic between an affected oc-mirror instance and the signature endpoints. No prior privileges are needed and no user interaction is required, and the impact on confidentiality and integrity is rated high, with no availability impact. The attack complexity is high for that reason: the traffic manipulation has to succeed.&lt;br&gt;
If it does, the tool syncs a malicious release payload into the private registry of a disconnected environment. Disconnected and air-gapped estates treat registry content as reviewed software, which is what makes the outcome a supply-chain problem rather than a single-host compromise. Once the payload is in the registry, an administrator or an automated installation pipeline can select it and deploy it, after which the cluster faces unauthorized code execution, application tampering, credential theft and unauthorized access to sensitive data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope detail worth noting
&lt;/h2&gt;

&lt;p&gt;The RHEL 8 variant of the plugin is not affected because the component does not exist in that release. Older packages in supported minor product branches inherit the flaw unless the advisory marks them as unaffected. Red Hat stated that at disclosure there was no practical mitigation that met its deployment and stability standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical mitigation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Restrict network access from oc-mirror hosts to the signature endpoints, and be deliberate about deploying TLS inspection, since the same interception capability is what the flaw requires.&lt;/li&gt;
&lt;li&gt;Monitor private registries for unexpected changes to synced content.&lt;/li&gt;
&lt;li&gt;Verify release image digests through an independent trusted channel before promoting anything to production.&lt;/li&gt;
&lt;li&gt;Review access control on the private registry and audit what has been synced recently.&lt;/li&gt;
&lt;li&gt;Track the Red Hat security advisory channel for the fixed package.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Red Hat, oc-mirror advisory referenced from the disclosure summary: &lt;a href="https://access.redhat.com/security/security-updates/" rel="noopener noreferrer"&gt;https://access.redhat.com/security/security-updates/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FreeBuf, 红帽披露OpenShift重要漏洞，可绕过PGP校验推送恶意镜像: &lt;a href="https://m.freebuf.com/column/502644.html" rel="noopener noreferrer"&gt;https://m.freebuf.com/column/502644.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;51Testing summary of the same advisory: &lt;a href="http://www.51testing.com/?action-viewnews-itemid-7811566" rel="noopener noreferrer"&gt;http://www.51testing.com/?action-viewnews-itemid-7811566&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openshift</category>
      <category>supplychain</category>
      <category>pgp</category>
      <category>disconnected</category>
    </item>
  </channel>
</rss>
