<?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: yutianle</title>
    <description>The latest articles on DEV Community by yutianle (@bianliang).</description>
    <link>https://dev.to/bianliang</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%2F4125308%2F36c3cc89-28d8-4805-856a-aced629d2d3c.png</url>
      <title>DEV Community: yutianle</title>
      <link>https://dev.to/bianliang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bianliang"/>
    <language>en</language>
    <item>
      <title>OIDC token hashes need a flow and an algorithm, not a generic equality check</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sun, 15 Nov 2026 11:42:20 +0000</pubDate>
      <link>https://dev.to/bianliang/oidc-token-hashes-need-a-flow-and-an-algorithm-not-a-generic-equality-check-37da</link>
      <guid>https://dev.to/bianliang/oidc-token-hashes-need-a-flow-and-an-algorithm-not-a-generic-equality-check-37da</guid>
      <description>&lt;h1&gt;
  
  
  OIDC token hashes need a flow and an algorithm, not a generic equality check
&lt;/h1&gt;

&lt;p&gt;OpenID Connect binds tokens and authorization codes to an ID Token with hash claims. &lt;code&gt;at_hash&lt;/code&gt; covers an access token in flows that return one from the authorization endpoint. &lt;code&gt;c_hash&lt;/code&gt; covers an authorization code in hybrid flows. The claim is a base64url encoded, left-most half of a hash of the ASCII representation of the bound value. A verifier that treats the value as an arbitrary opaque string is not performing the check the specification describes.&lt;/p&gt;

&lt;p&gt;The hash algorithm is tied to the JWS algorithm used to sign the ID Token. A verifier must first validate the signature and establish the key, then calculate the expected hash with the matching function. Do not accept an algorithm supplied only by the token's own header when that algorithm is outside the client's registered policy.&lt;/p&gt;

&lt;p&gt;OpenID's Token Hash Algorithm Implementer's Guide adds a useful distinction for modern algorithms. &lt;code&gt;EdDSA&lt;/code&gt; does not identify a single hash function by name. The implementation must determine the parameter set from the validated key, including the JWK &lt;code&gt;crv&lt;/code&gt; value. The guide records SHA-512 for Ed25519 and SHAKE256 for the ML-DSA family, while noting that decisions for SLH-DSA remain open. A generic hash selector keyed only by &lt;code&gt;alg&lt;/code&gt; will be wrong or incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the flow that produced the ID Token
&lt;/h2&gt;

&lt;p&gt;An authorization response that includes an access token or authorization code is a different event from a token-endpoint response. In the relevant flows, &lt;code&gt;c_hash&lt;/code&gt; and &lt;code&gt;at_hash&lt;/code&gt; let the client detect substitution during the front-channel exchange. The claim is not a replacement for PKCE, state validation, nonce validation, issuer validation, or audience validation.&lt;/p&gt;

&lt;p&gt;Read the claim in context. An optional claim that is present should be checked. A required claim that is missing should be a failure. A claim from a different flow should not be accepted just because its field name is familiar.&lt;/p&gt;

&lt;p&gt;The comparison should be constant time and should use validated bytes, not a browser-normalized string. Handle padding and base64url exactly as specified. Reject a digest with the wrong length instead of comparing a prefix. Keep a test vector for each registered JWS algorithm the client accepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operate the algorithm policy
&lt;/h2&gt;

&lt;p&gt;Record the JWS algorithm, key type, hash function, and flow in logs. Do not record the code, access token, or ID Token. Alert when a provider begins issuing a key type that the client has not tested. During key rotation, validate the new key and its parameter set before enabling the algorithm for production.&lt;/p&gt;

&lt;p&gt;Test a token with the right signature and wrong &lt;code&gt;at_hash&lt;/code&gt;, a token with the right hash and wrong audience, and an &lt;code&gt;EdDSA&lt;/code&gt; token whose key curve changes. These cases separate signature validation from claim binding. They also catch a client that accidentally validates only the happy path.&lt;/p&gt;

&lt;p&gt;The hash claim is a small field with a narrow job. It ties one token value to one signed identity response in one flow. Implement that job precisely, and leave authorization to the claims and policies designed to carry it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openid.net/specs/openid-connect-core-1_0.html" rel="noopener noreferrer"&gt;OpenID Connect Core 1.0 incorporating errata set 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openid.net/specs/openid-connect-token-hash-algorithms-1_0.html" rel="noopener noreferrer"&gt;OpenID Connect Token Hash Algorithm Implementer's Guide 1.0, draft 00&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Greenplum discovery has to distinguish the database, the master, and the console</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sun, 15 Nov 2026 08:23:19 +0000</pubDate>
      <link>https://dev.to/bianliang/greenplum-discovery-has-to-distinguish-the-database-the-master-and-the-console-1kl6</link>
      <guid>https://dev.to/bianliang/greenplum-discovery-has-to-distinguish-the-database-the-master-and-the-console-1kl6</guid>
      <description>&lt;h1&gt;
  
  
  Greenplum discovery has to distinguish the database, the master, and the console
&lt;/h1&gt;

&lt;p&gt;Greenplum is a distributed analytical database built from a coordinator and segments. A public page that carries its name may describe the database, a client library, a command center, or a deployment guide. The security review must find the actual PostgreSQL-compatible endpoint and the administrative path around it.&lt;/p&gt;

&lt;p&gt;A count-only ZoomEye probe on November 15, 2026 used &lt;code&gt;sub_type=all&lt;/code&gt;, page 1, and page size 1. &lt;code&gt;app="Greenplum"&lt;/code&gt; returned 3, &lt;code&gt;title="Greenplum"&lt;/code&gt; returned 292, and &lt;code&gt;http.body="Greenplum"&lt;/code&gt; returned 2,365. These are index observations. The body count can include documentation and package pages, and the title count does not prove that a database is reachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start at the coordinator
&lt;/h2&gt;

&lt;p&gt;The master or coordinator controls client access to the cluster. Its &lt;code&gt;pg_hba.conf&lt;/code&gt; rules define which database, role, address, and authentication method can connect. Segment configuration normally restricts client connections to the coordinator. Review the coordinator's rules first, then confirm that segments do not accept the same external client path.&lt;/p&gt;

&lt;p&gt;Greenplum uses roles to manage database access. Inventory superuser roles, login roles, group memberships, and object privileges. A role with broad read access can reach every analytical dataset that the cluster hosts. A role that can create functions or extensions may have a much larger authority than a reporting user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate management from query access
&lt;/h2&gt;

&lt;p&gt;A command center or web console is a management plane. It may reach multiple clusters and hold database credentials. The console URL, its identity provider, its users, and its stored cluster list need separate review from the SQL endpoint.&lt;/p&gt;

&lt;p&gt;Use TLS for remote SQL connections and verify the server certificate. If Kerberos or LDAP is available, document the exact authentication path and the fallback behavior. A fallback to a broad password rule can bypass a carefully designed directory policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn matches into owners
&lt;/h2&gt;

&lt;p&gt;For each title or body match, identify the organization and the product context. A documentation page is not a coordinator. A confirmed endpoint should have a host, port, database name, server version, role owner, TLS state, and application dependency.&lt;/p&gt;

&lt;p&gt;Bound the data sample used during validation. Analytical databases often contain customer, financial, or operational records. Do not run broad queries or export rows from a host you do not own. Record the endpoint and configuration evidence instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operate the boundary
&lt;/h2&gt;

&lt;p&gt;Rotate the credentials used by the console and by ETL jobs separately. Log connections with role, database, source address, and result, but do not log statements that contain sensitive values. Review grants after every new data source or reporting application. A Greenplum coordinator can be a single credential path to many datasets, which makes role review more important than the product count.&lt;/p&gt;

&lt;p&gt;The small application count is not a low-risk conclusion. It means the fingerprint needs corroboration. Find the coordinator and its management console, then establish who can query and who can administer the cluster.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs-cn.greenplum.org/v6/admin_guide/client_auth.html" rel="noopener noreferrer"&gt;Greenplum client authentication and pg_hba.conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs-cn.greenplum.org/v6/security-guide/topics/Authorization.html" rel="noopener noreferrer"&gt;Greenplum authorization and roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs-cn.greenplum.org/v6/security-guide/topics/ports_and_protocols.html" rel="noopener noreferrer"&gt;Greenplum ports and protocols&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>zoomeye</category>
    </item>
    <item>
      <title>Unknown Protobuf Fields Need a Boundary Before They Reach Internal Services</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sun, 15 Nov 2026 05:03:38 +0000</pubDate>
      <link>https://dev.to/bianliang/unknown-protobuf-fields-need-a-boundary-before-they-reach-internal-services-6oa</link>
      <guid>https://dev.to/bianliang/unknown-protobuf-fields-need-a-boundary-before-they-reach-internal-services-6oa</guid>
      <description>&lt;h1&gt;
  
  
  Unknown Protobuf Fields Need a Boundary Before They Reach Internal Services
&lt;/h1&gt;

&lt;p&gt;Protocol Buffers are designed for evolution. A parser that does not recognize a field can retain it and write it back when the message is reserialized. The language guide documents this retention behavior for proto3 and proto2. It is a useful compatibility property: an old service can modify a message without destroying fields that a newer service understands.&lt;/p&gt;

&lt;p&gt;That same property changes the meaning of validation in a multi-service path. A public gateway may parse a request into a current message type, inspect the fields it knows, and forward the reserialized object. Unknown fields carried through the gateway can reach an internal service with a newer schema that gives them meaning. The gateway has effectively forwarded a command it never authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation is schema- and boundary-dependent
&lt;/h2&gt;

&lt;p&gt;The risk is not that unknown fields exist. The risk is that a component claims to validate a message while preserving fields outside its validation model. If the design requires a closed command, the boundary should reject unknown fields or strip them before forwarding. If forward compatibility is required, the receiving service must apply authorization to every field it interprets, including fields that the gateway did not see.&lt;/p&gt;

&lt;p&gt;The issue becomes sharper when the gateway maps protobuf into a second representation. A proxy may convert a message to JSON, drop unknowns, and reconstruct it later. That can be safe, but only if the transformation and the receiving schema agree about field presence and defaults. Proto3 serialization is not canonical, so a byte comparison of messages is not a safe substitute for semantic validation and authorization.&lt;/p&gt;

&lt;p&gt;Do not use a protobuf hash as a signature over a partially validated request. Field ordering, unknown fields, and encoding choices can produce different bytes for the same logical message. Authenticate the transport and the signed payload under a documented canonicalization rule, then validate the decoded command against a schema and an authorization policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design options
&lt;/h2&gt;

&lt;p&gt;The most conservative public boundary uses a dedicated request message that contains only the fields the public API supports. The gateway validates it, authorizes the caller, and constructs a new internal command from named fields. Unknown fields are discarded by construction rather than by a fragile recursive strip.&lt;/p&gt;

&lt;p&gt;An internal compatibility boundary can preserve unknown fields, but it should be an explicit contract. The internal service owns authorization for the full message version it accepts. It should not trust a gateway assertion that a message was already validated if the gateway's schema is older than the receiving schema.&lt;/p&gt;

&lt;p&gt;Record the schema version and descriptor hash at each tier. Add tests that send a field understood by the downstream service but absent from the gateway schema, then verify the resulting authorization decision. Test an unknown field that changes a oneof or enum value, and test a message that round-trips through each language runtime used by the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operate the schema as code
&lt;/h2&gt;

&lt;p&gt;Schema changes should go through the same review as code. Mark removed fields as reserved, document compatibility expectations, and review new security-sensitive fields with the services that will interpret them. A field named &lt;code&gt;is_admin&lt;/code&gt;, &lt;code&gt;tenant_id&lt;/code&gt;, or &lt;code&gt;actor&lt;/code&gt; deserves a dedicated threat review even if the public gateway cannot currently set it.&lt;/p&gt;

&lt;p&gt;Unknown-field retention is not a vulnerability by itself. It is a warning that a message may mean more than one component thinks it means. The security boundary should be explicit about where unknowns stop, which service interprets them, and how the authorization layer learns about them.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://protobuf.dev/programming-guides/proto3/" rel="noopener noreferrer"&gt;Protocol Buffers: Proto3 Language Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protobuf.dev/programming-guides/serialization-not-canonical/" rel="noopener noreferrer"&gt;Protocol Buffers: Serialization Is Not Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protobuf.dev/programming-guides/proto2/" rel="noopener noreferrer"&gt;Protocol Buffers: Proto2 Language Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>cybersecurityarticle</category>
    </item>
    <item>
      <title>An Otter Wiki Proxy Header Can Carry More Than an Identity</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sun, 15 Nov 2026 01:43:22 +0000</pubDate>
      <link>https://dev.to/bianliang/an-otter-wiki-proxy-header-can-carry-more-than-an-identity-3gk3</link>
      <guid>https://dev.to/bianliang/an-otter-wiki-proxy-header-can-carry-more-than-an-identity-3gk3</guid>
      <description>&lt;h1&gt;
  
  
  An Otter Wiki Proxy Header Can Carry More Than an Identity
&lt;/h1&gt;

&lt;p&gt;An Otter Wiki is a small self-hosted wiki built with Python, Markdown, and Git. The first account created in a deployment becomes an administrator. The project also supports proxy-header authentication, which lets a reverse proxy supply the authenticated user and a permission list.&lt;/p&gt;

&lt;p&gt;The ZoomEye measurement on 15 November 2026 found 0 matches for &lt;code&gt;app="Otterwiki"&lt;/code&gt;, 2 for &lt;code&gt;title="Otterwiki"&lt;/code&gt;, and 267 for &lt;code&gt;http.body="Otterwiki"&lt;/code&gt; with &lt;code&gt;sub_type=all&lt;/code&gt;, page 1, and page size 1. These are very small discovery counts. The body result can include documentation and package pages, so it should not be read as two hundred live deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The proxy must overwrite the header
&lt;/h2&gt;

&lt;p&gt;Otter Wiki's configuration documentation describes &lt;code&gt;AUTH_METHOD='PROXY_HEADER'&lt;/code&gt; and an &lt;code&gt;x-otterwiki-permissions&lt;/code&gt; header whose accepted values include &lt;code&gt;READ&lt;/code&gt;, &lt;code&gt;WRITE&lt;/code&gt;, &lt;code&gt;UPLOAD&lt;/code&gt;, and &lt;code&gt;ADMIN&lt;/code&gt;. That design is only safe when the reverse proxy removes any client-supplied value and writes the trusted identity and permission headers after successful authentication. A proxy that appends to the request or preserves unknown headers can let a caller choose its own permissions.&lt;/p&gt;

&lt;p&gt;The header set is an authorization decision, not a display name. The proxy and the wiki must agree on the possible values, the default when no header is present, and the behavior for an invalid value. Test each permission and confirm that &lt;code&gt;WRITE&lt;/code&gt; does not imply &lt;code&gt;ADMIN&lt;/code&gt;, that an anonymous request cannot upload, and that a revoked identity loses access immediately.&lt;/p&gt;

&lt;p&gt;The first administrator should be created through a controlled setup and removed from the bootstrap path afterward. Review registration, password recovery, user administration, and the Git server integration. The repository-management documentation notes that users with &lt;code&gt;READ&lt;/code&gt; can pull and users with &lt;code&gt;UPLOAD&lt;/code&gt; can push when the Git server is enabled. That turns repository access into a second permission surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inventory the content path
&lt;/h2&gt;

&lt;p&gt;List the wiki hostname, version, authentication mode, proxy identity source, administrator, Git server state, storage location, and backup policy. Review custom templates and injected HTML because the wiki renders content for other users. Check whether attachments and repository remotes can reach internal addresses or execute deployment hooks.&lt;/p&gt;

&lt;p&gt;The title count is not enough to identify the deployment, but the configuration question is clear. If the wiki trusts a header, the network path to the wiki must be limited to the proxy that sets it. A reverse proxy with permissive header forwarding can turn a logging or SSO integration into an administrator path.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.zoomeye.ai/" rel="noopener noreferrer"&gt;ZoomEye&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://otterwiki.com/Installation" rel="noopener noreferrer"&gt;An Otter Wiki installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://otterwiki.com/Configuration" rel="noopener noreferrer"&gt;An Otter Wiki configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://otterwiki.com/Configuration/Repository%20Management" rel="noopener noreferrer"&gt;An Otter Wiki repository management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>zoomeyearticle</category>
    </item>
    <item>
      <title>Datasette Default Permissions Turn a Data File Into an Exposure Surface</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 22:21:02 +0000</pubDate>
      <link>https://dev.to/bianliang/datasette-default-permissions-turn-a-data-file-into-an-exposure-surface-5clo</link>
      <guid>https://dev.to/bianliang/datasette-default-permissions-turn-a-data-file-into-an-exposure-surface-5clo</guid>
      <description>&lt;h1&gt;
  
  
  Datasette Default Permissions Turn a Data File Into an Exposure Surface
&lt;/h1&gt;

&lt;p&gt;Datasette publishes SQLite data through a web interface and API. Its default view permissions are permissive, which means the first security question is not whether the product is identifiable but whether the database was meant to be public. A bounded ZoomEye run on November 15, 2026 returned 224 matches for &lt;code&gt;app="Datasette"&lt;/code&gt;, 484 for &lt;code&gt;title="Datasette"&lt;/code&gt; and 928 for &lt;code&gt;http.body="Datasette"&lt;/code&gt;. All queries used &lt;code&gt;sub_type=all&lt;/code&gt;, page 1 and page size 1.&lt;/p&gt;

&lt;p&gt;The application fingerprint is still not a deployment count. It is a field-level observation that can include documentation, demos, a hosted catalog, or a real instance. The title and body counts add different leads. For an owned domain, a successful app match is a good reason to verify the serving process and the database path, not a reason to assume data is exposed.&lt;/p&gt;

&lt;p&gt;Datasette's authentication documentation explains that built-in view actions default to allow unless additional permission rules are configured. The &lt;code&gt;--default-deny&lt;/code&gt; option denies anonymous and unauthenticated access, and explicit rules can grant view, query or write actions to named actors. API tokens are available through built-in and plugin mechanisms. This makes authentication and per-resource authorization two separate checks.&lt;/p&gt;

&lt;p&gt;Review every database and table, not just the landing page. A public table can reveal row counts, columns and content even when write actions are disabled. A read-only token can still expose sensitive rows. Use a deny-by-default configuration for private data, grant only the view or query actions required by the application, and keep a separate privileged token for maintenance.&lt;/p&gt;

&lt;p&gt;The root login URL is single-use, but it is also a powerful bootstrap credential. Treat it as an administrative secret and rotate or disable it after setup. Put the service behind a network boundary when the data is not intended for the open internet, and log token use without recording the token.&lt;/p&gt;

&lt;p&gt;Test an anonymous instance request, an anonymous table request, a token with the wrong database, and a revoked token. The expected result is a clear 401 or 403 before SQL execution. The 224 app matches show that this fingerprint is useful. They do not replace a content owner's decision about which SQLite files belong online.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.datasette.io/en/latest/authentication.html" rel="noopener noreferrer"&gt;Datasette authentication and permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.datasette.io/" rel="noopener noreferrer"&gt;Datasette documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoomeye.ai/searchResult?q=aHR0cC5ib2R5PSJEYXRhc2V0dGUi" rel="noopener noreferrer"&gt;ZoomEye body query&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>technical</category>
    </item>
    <item>
      <title>Apache Sling title matches are a starting point for XSS-helper review</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 19:04:54 +0000</pubDate>
      <link>https://dev.to/bianliang/apache-sling-title-matches-are-a-starting-point-for-xss-helper-review-4b7o</link>
      <guid>https://dev.to/bianliang/apache-sling-title-matches-are-a-starting-point-for-xss-helper-review-4b7o</guid>
      <description>&lt;h1&gt;
  
  
  Apache Sling title matches are a starting point for XSS-helper review
&lt;/h1&gt;

&lt;p&gt;Apache Sling is a Java web framework for content-centric applications. Many sites expose the framework through application paths, author interfaces, or a generated title. A November 2026 advisory describes CVE-2026-123765 in Apache Sling XSS before version 2.4.14. The flaw is a cross-site scripting issue where &lt;code&gt;xssAPI.getStyleToken()&lt;/code&gt; accepts markup in unquoted URLs.&lt;/p&gt;

&lt;p&gt;A ZoomEye count-only observation on 15 November 2026 returned 0 for &lt;code&gt;app="Apache Sling"&lt;/code&gt;, 189 for &lt;code&gt;title="Apache Sling"&lt;/code&gt;, and 1,162 for &lt;code&gt;http.body="Apache Sling"&lt;/code&gt;. The scope was &lt;code&gt;sub_type=all&lt;/code&gt;, page 1, page size 1.&lt;/p&gt;

&lt;p&gt;The title result is small enough to review as a candidate set. It is still not a deployment census. A page title can be set by a template, copied by documentation, or shared by an application that uses Sling in only one component. The application count was zero in this snapshot, so the body and title markers provide the handholds.&lt;/p&gt;

&lt;p&gt;The XSS helper is a library inside an application. A public page does not reveal whether a specific template calls &lt;code&gt;getStyleToken()&lt;/code&gt; or whether an unquoted URL reaches the vulnerable function. The owner needs the Sling XSS dependency version and the code path that builds style tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify the application and dependency
&lt;/h2&gt;

&lt;p&gt;Match title and body candidates to DNS inventory, certificates, content owners, and application teams. Confirm that the host serves a Sling-based application. Record the application URL, visible version if any, authentication method, and development owner.&lt;/p&gt;

&lt;p&gt;Search source manifests and application bundles for &lt;code&gt;org.apache.sling.xss&lt;/code&gt; and the affected release range. Check transitive dependencies and custom bundles. A site can run a recent Sling platform while retaining an older XSS helper package.&lt;/p&gt;

&lt;p&gt;Review templates that call &lt;code&gt;getStyleToken()&lt;/code&gt; and any code that builds URLs without quoting. Trace user-controlled inputs into the helper. Test with harmless markup in a staging environment to verify that the rendered response is encoded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade and constrain
&lt;/h2&gt;

&lt;p&gt;Upgrade Apache Sling XSS to 2.4.14 or later. Rebuild the application bundle and restart the services that load it. Confirm the resolved package version in the runtime.&lt;/p&gt;

&lt;p&gt;If the helper does not need to accept markup, reject it at the input boundary. Use a strict URL parser and an allow-list for schemes and hosts. Apply a Content Security Policy as defense in depth, but do not use it to excuse an unpatched server-side encoder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review exposed content
&lt;/h2&gt;

&lt;p&gt;Look for editorial forms, style selectors, rich-text fields, and URL parameters that reach &lt;code&gt;getStyleToken()&lt;/code&gt;. Review the application's session cookies and administrative actions. A cross-site scripting issue can turn a seemingly low-severity content flaw into account actions performed by a privileged editor.&lt;/p&gt;

&lt;p&gt;After the upgrade, test normal styles and a malicious unquoted URL fixture. Confirm that the output is encoded or rejected and that the template still works. Record the dependency version, affected templates, test result, and owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the search honest
&lt;/h2&gt;

&lt;p&gt;A title match is a candidate for version verification, not proof that the XSS helper is exposed. The selected &lt;code&gt;title="Apache Sling"&lt;/code&gt; count of 189 is useful because it is narrow, but it remains an index observation. The 1,162 body matches are a broader lead source.&lt;/p&gt;

&lt;p&gt;Use the counts to find owned applications. Use the package inventory and template review to decide whether the XSS path is reachable. That separation keeps a manageable public search from turning into an unsupported vulnerability claim.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openwall.com/lists/oss-security/2026/11/11/22" rel="noopener noreferrer"&gt;Apache Sling XSS advisory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sling.apache.org/news.html" rel="noopener noreferrer"&gt;Apache Sling news and advisories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoomeye.ai/searchResult?q=dGl0bGU9IkFwYWNoZSBTbGluZyI%3D" rel="noopener noreferrer"&gt;ZoomEye count observation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zoomeye</category>
      <category>apachesling</category>
      <category>xss</category>
      <category>inventory</category>
    </item>
    <item>
      <title>Reducing Zimbra Classic Web Client Exposure Without Breaking Mail</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 15:41:31 +0000</pubDate>
      <link>https://dev.to/bianliang/reducing-zimbra-classic-web-client-exposure-without-breaking-mail-25ei</link>
      <guid>https://dev.to/bianliang/reducing-zimbra-classic-web-client-exposure-without-breaking-mail-25ei</guid>
      <description>&lt;h1&gt;
  
  
  Reducing Zimbra Classic Web Client Exposure Without Breaking Mail
&lt;/h1&gt;

&lt;p&gt;CVE-2026-10632 sits inside the Zimbra Classic Web Client document editor, not in the mail transport path itself. That detail helps administrators choose temporary controls. A team can restrict the vulnerable browser surface while keeping mail delivery, SMTP, and approved client access running.&lt;/p&gt;

&lt;p&gt;The flaw is a reflected XSS in the &lt;code&gt;/h/rest&lt;/code&gt; editor. The &lt;code&gt;packages&lt;/code&gt; parameter is inserted into script attributes without HTML encoding. CVE-2026-50053 adds request-attribute override behavior, allowing a crafted URL to execute JavaScript in another signed-in user's session. The victim has to open the URL, and the attacker needs an ordinary Zimbra account. NVD records CVSS 3.1 8.7 High and affected versions below 10.1.17 in the CVE record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the real browser surface
&lt;/h2&gt;

&lt;p&gt;Inventory every route that serves Classic Web Client content. Include direct mailbox servers, load-balanced front ends, disaster-recovery systems, regional proxies, and any legacy hostname retained for compatibility. Confirm whether &lt;code&gt;/h/rest&lt;/code&gt; is reachable through each public and internal path.&lt;/p&gt;

&lt;p&gt;Separate user groups that need Classic features from those that can use Modern or a supported mail client. Document editor, Briefcase, and other Classic workflows may be essential for some teams. Treating all users as interchangeable can turn a security restriction into an outage or force an exception that bypasses the control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose controls that match the risk
&lt;/h2&gt;

&lt;p&gt;An internet restriction on Classic Web Client endpoints can reduce the chance that an external attacker delivers the crafted URL to an exposed session. Split-horizon access, VPN enforcement, and an allowlist at the reverse proxy are examples of deployment-specific controls. Each one needs testing against normal mail use and a clear exception process.&lt;/p&gt;

&lt;p&gt;A web application firewall rule can flag or block suspicious &lt;code&gt;/h/rest&lt;/code&gt; requests containing a &lt;code&gt;packages&lt;/code&gt; parameter. The rule must allow legitimate document-editor traffic where it is needed. Start in detection mode, review false positives, and tune against actual paths. A generic XSS signature may not understand the token and document relationship at the center of this CVE, so blocking should not be the only response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep mail operations stable
&lt;/h2&gt;

&lt;p&gt;Do not disable SMTP, IMAP, POP, or supported desktop clients as a shortcut. They are not the vulnerable endpoint described by the CVE, and broad disruption creates pressure to reverse protective controls. If security teams need a maintenance window, coordinate it with mail operations and user support so exceptions and rollback steps are known.&lt;/p&gt;

&lt;p&gt;Session management deserves specific attention. Verify that administrators can revoke active web sessions and that the process is documented. Review how delegates, application passwords, and shared accounts are treated. A temporary access restriction that leaves a compromised session active only changes where the session can be reached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Return to the patched service
&lt;/h2&gt;

&lt;p&gt;ZCS 10.1.17 is the remediation release named for CVE-2026-10632. Upgrade every reachable Classic Web Client path to 10.1.17 or a later supported security release, then verify the running build. Remove temporary proxy rules and legacy routing exceptions when they are no longer needed.&lt;/p&gt;

&lt;p&gt;Exposure reduction buys time; it does not replace the fix. The closure record should name the vulnerable routes, the temporary controls, the owner of each exception, the patched build, and the test showing that users can reach the approved service. That record gives the next administrator enough context to prevent an old compatibility path from reappearing unnoticed.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-10632" rel="noopener noreferrer"&gt;CVE-2026-10632 record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-10632" rel="noopener noreferrer"&gt;NVD CVE-2026-10632&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.zimbra.com/wiki/Zimbra_Security_Advisories" rel="noopener noreferrer"&gt;Zimbra security advisories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rapid7.com/blog/post/ve-breaking-zimbra-identity-boundaries-part-1/" rel="noopener noreferrer"&gt;Rapid7 Zimbra identity-boundary research&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zimbra</category>
      <category>cve202610632</category>
      <category>exposuremanagement</category>
    </item>
    <item>
      <title>GlobalProtect RADIUS Challenge Path Underlies PAN-OS CVE-2026-0327</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 12:22:49 +0000</pubDate>
      <link>https://dev.to/bianliang/globalprotect-radius-challenge-path-underlies-pan-os-cve-2026-0327-537m</link>
      <guid>https://dev.to/bianliang/globalprotect-radius-challenge-path-underlies-pan-os-cve-2026-0327-537m</guid>
      <description>&lt;h1&gt;
  
  
  GlobalProtect RADIUS Challenge Path Underlies PAN-OS CVE-2026-0327
&lt;/h1&gt;

&lt;p&gt;CVE-2026-0327 is a privilege escalation issue in the GlobalProtect gateway of PAN-OS. Palo Alto Networks says an authenticated, lower-privileged user can obtain the privileges and configuration of a higher-privileged user. The vulnerability is exposed when a GlobalProtect gateway uses a RADIUS authentication profile that issues a supported authentication challenge.&lt;/p&gt;

&lt;p&gt;The vendor published the advisory on November 11, 2026. Cloud NGFW and Panorama are not affected. Palo Alto Networks reported no awareness of malicious exploitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the configuration condition is central
&lt;/h2&gt;

&lt;p&gt;The rating data is easy to misread. The CVSS 4.0 base score is 6.0, but the vendor's threat score is 2.3. The threat score reflects low reported exploit maturity and specific attack requirements. The base score still describes a network-reachable integrity and privilege boundary.&lt;/p&gt;

&lt;p&gt;Administrators should inventory every GlobalProtect gateway, then follow the client authentication reference to its authentication profile. Confirm whether that profile uses a RADIUS server profile and whether the server can issue a supported challenge. A gateway that uses SAML or a certificate profile is not exposed through the same path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Affected releases
&lt;/h2&gt;

&lt;p&gt;The affected PAN-OS ranges were below 12.2.4-h2, 12.1.10-h4, 11.2.16-h2, and 11.1.16-h5. Fixed releases are the same listed hotfix levels. Prisma Access 12.1 before 12.1.10-h4 was affected and is scheduled for vendor maintenance; Prisma Access 11.2 was listed as affected in full. Older unsupported PAN-OS versions need an upgrade to a supported fixed release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mitigation without breaking access
&lt;/h2&gt;

&lt;p&gt;Palo Alto Networks recommends changing the gateway's client authentication to a non-challenge profile, such as SAML, or assigning a certificate profile to enforce client certificate authentication. These changes affect the login experience and may require identity-provider coordination.&lt;/p&gt;

&lt;p&gt;Test the change with a small set of users and devices before committing it to all gateways. Record the previous authentication profile so the rollback path is explicit. A temporary mitigation should have an owner, an expiry date, and a monitoring check that confirms the intended profile remains active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privilege review
&lt;/h2&gt;

&lt;p&gt;This vulnerability concerns privilege and configuration access after authentication. Review the roles assigned to GlobalProtect users, the configuration scopes available to those roles, and the accounts that can change gateway authentication profiles.&lt;/p&gt;

&lt;p&gt;Look for unusual changes to administrator roles, configuration exports, and authentication profile references during the exposure window. A successful exploit may appear as legitimate authenticated activity, so identity logs and management-plane audit logs need to be joined by user, source address, and time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Response checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Inventory all GlobalProtect gateways and their client authentication profiles.&lt;/li&gt;
&lt;li&gt;Identify RADIUS-backed, challenge-capable profiles.&lt;/li&gt;
&lt;li&gt;Patch to the fixed release or apply the vendor mitigation.&lt;/li&gt;
&lt;li&gt;Confirm the running release on every firewall and HA peer.&lt;/li&gt;
&lt;li&gt;Rotate credentials if management audit or configuration access suggests compromise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The issue does not justify removing GlobalProtect from service without evidence. It does require knowing which gateways depend on the vulnerable authentication behavior and which administrators could be reached through the resulting privilege boundary.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://security.paloaltonetworks.com/CVE-2026-0327" rel="noopener noreferrer"&gt;Palo Alto Networks advisory for CVE-2026-0327&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>paloalto</category>
      <category>globalprotect</category>
      <category>radius</category>
    </item>
    <item>
      <title>GlobalProtect Title Volume Requires a Narrower Exposure Question</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 09:03:40 +0000</pubDate>
      <link>https://dev.to/bianliang/globalprotect-title-volume-requires-a-narrower-exposure-question-1hae</link>
      <guid>https://dev.to/bianliang/globalprotect-title-volume-requires-a-narrower-exposure-question-1hae</guid>
      <description>&lt;h1&gt;
  
  
  GlobalProtect Title Volume Requires a Narrower Exposure Question
&lt;/h1&gt;

&lt;p&gt;CVE-2026-0327 affects the GlobalProtect gateway in PAN-OS when an authentication profile uses a RADIUS provider and issues a supported challenge. The vulnerability is a privilege boundary issue for authenticated lower-privileged users. Internet measurement can find GlobalProtect-related pages, but it cannot prove the authentication profile behind those pages.&lt;/p&gt;

&lt;p&gt;At 2026-11-14 07:48 Asia/Shanghai, using &lt;code&gt;sub_type=all&lt;/code&gt;, page 1, and page size 1, ZoomEye returned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app="GlobalProtect"&lt;/code&gt;: 610 matches.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;title="GlobalProtect"&lt;/code&gt;: 1,242,532 matches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap is large enough to make the reporting lesson obvious. A title match is useful for discovery and very weak as a count of exposed gateways.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the title count captures
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;title="GlobalProtect"&lt;/code&gt; asks ZoomEye for pages whose HTML title contains the term. That can include portals, login pages, product documentation, support articles, and pages that mention the service. The result is a search-engine observation, not a verified inventory of GlobalProtect gateways.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;app&lt;/code&gt; count is narrower and still does not establish the RADIUS challenge configuration. It may include public management or portal interfaces that ZoomEye classified with the application label.&lt;/p&gt;

&lt;h2&gt;
  
  
  The vulnerability condition
&lt;/h2&gt;

&lt;p&gt;The vendor says the affected configuration is a GlobalProtect gateway whose client authentication profile uses a RADIUS provider and can issue a supported challenge. Changing the profile to SAML or using a client certificate profile is listed as a mitigation. Patching to 12.2.4-h2, 12.1.10-h4, 11.2.16-h2, or 11.1.16-h5 is the permanent fix for the listed branches.&lt;/p&gt;

&lt;p&gt;An internet-facing portal is a useful lead because it can expose the gateway's authentication workflow. It is not evidence that the RADIUS condition is present. That requires configuration inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a useful list
&lt;/h2&gt;

&lt;p&gt;Use the ZoomEye result to identify candidates for ownership review. Then locate each candidate in the PAN-OS inventory and open its client authentication configuration. Record the authentication profile, RADIUS provider, and whether a supported challenge is issued.&lt;/p&gt;

&lt;p&gt;For external attack-surface programs, do not test authentication bypass or privilege escalation against systems outside the authorized scope. The query is a discovery aid, not permission to probe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing counts responsibly
&lt;/h2&gt;

&lt;p&gt;The 610 application matches and 1,242,532 title matches are not two estimates of the same population. They are different fields with different semantics. Reporting them as a range would be misleading. The better report says the title field is broad, the application field is narrower, and neither field identifies the vulnerable configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;ZoomEye provides a useful view of where GlobalProtect content appears on public web assets. It does not replace configuration inventory. The next step is to join the discovered candidates with PAN-OS asset records and authentication-profile evidence.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://security.paloaltonetworks.com/CVE-2026-0327" rel="noopener noreferrer"&gt;Palo Alto Networks CVE-2026-0327 advisory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoomeye.ai/searchResult?q=YXBwPSJHbG9iYWxQcm90ZWN0Ig%3D%3D" rel="noopener noreferrer"&gt;ZoomEye application query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoomeye.ai/searchResult?q=dGl0bGU9Ikdsb2JhbFByb3RlY3Qi" rel="noopener noreferrer"&gt;ZoomEye title query&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>globalprotect</category>
      <category>zoomeye</category>
      <category>attacksurface</category>
    </item>
    <item>
      <title>Structured Fields Need One Parser at Every Trust Boundary</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 05:42:33 +0000</pubDate>
      <link>https://dev.to/bianliang/structured-fields-need-one-parser-at-every-trust-boundary-4lhf</link>
      <guid>https://dev.to/bianliang/structured-fields-need-one-parser-at-every-trust-boundary-4lhf</guid>
      <description>&lt;h1&gt;
  
  
  Structured Fields Need One Parser at Every Trust Boundary
&lt;/h1&gt;

&lt;p&gt;HTTP fields are often parsed by several components before an application sees a decision. A proxy may inspect a cache directive, a gateway may check a signature and an origin may parse the same bytes for authorization. If those components disagree about whitespace, duplicate members, parameter order or type conversion, the system can enforce one meaning while acting on another.&lt;/p&gt;

&lt;p&gt;RFC 9651 defines Structured Field Values for HTTP. It provides typed Items, Lists and Dictionaries with a precise parsing and serialization model. A field definition can specify an Item, List or Dictionary and can constrain parameters. The benefit comes from shared behavior, not from placing quotes around a value and calling it structured.&lt;/p&gt;

&lt;p&gt;The trust-boundary problem is easiest to see in a signed request. A signer canonicalizes selected fields and sends a signature. A verifier must reconstruct exactly the same component values using the same field type and canonical form. If the verifier treats a dictionary-like string as opaque text while the signer uses the structured serializer, a duplicate key or changed whitespace may produce a valid signature over a different policy interpretation.&lt;/p&gt;

&lt;p&gt;RFC 9421 uses Structured Fields where available to make HTTP Message Signature component values deterministic. Even outside signing, the same principle applies to cache controls, authentication metadata, tracing policy and custom gateway fields. One parser should produce a validated data structure, and every downstream policy should consume that structure.&lt;/p&gt;

&lt;p&gt;Practical controls begin with field definitions. Reject values that the selected field type does not allow. Decide whether duplicate dictionary keys are an error, last-value-wins or a policy violation. Limit total length, list members and depths so a parsing error does not turn into an unbounded allocation. Record the normalized value that the security decision used.&lt;/p&gt;

&lt;p&gt;Do not compare a signature or policy against a hand-built concatenation of raw header text. Use the library's canonical serializer and confirm that all components are present, unambiguous and allowed for the request context. Header names are case-insensitive, but Structured Field member keys and some tokens have their own rules. String case is data, not a normalization convenience.&lt;/p&gt;

&lt;p&gt;Proxy chains need a named owner for each field. If a gateway strips a client value and writes its own, the origin should not accept the client's version as equivalent. If a component is not understood, forwarding it unchanged can be safer than guessing, but the security policy must state whether unknown structured parameters are ignored or rejected.&lt;/p&gt;

&lt;p&gt;Tests should include quoted strings with escaped characters, duplicate dictionary keys, invalid bare tokens, byte sequences, parameters in different orders and values near configured limits. Send the same bytes through each proxy and compare the parsed decision object. A test that only checks the final HTTP status can miss a parser disagreement when both paths happen to deny a different reason.&lt;/p&gt;

&lt;p&gt;Structured Fields reduce ambiguity when the whole chain adopts the type model. The remaining risk is governance. A field without a defined type, a second unofficial parser or a component that rewrites values without recording the change can defeat the benefit. Put the parser and normalization rules under version control, expose their output to tests and review changes as security-sensitive code.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9651.html" rel="noopener noreferrer"&gt;RFC 9651: Structured Field Values for HTTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9421.html" rel="noopener noreferrer"&gt;RFC 9421: HTTP Message Signatures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>http</category>
      <category>structuredfields</category>
      <category>parsersecurity</category>
      <category>messagesignatures</category>
    </item>
    <item>
      <title>ApostropheCMS: Public Pages Do Not Describe the Editing Plane</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Sat, 14 Nov 2026 02:20:12 +0000</pubDate>
      <link>https://dev.to/bianliang/apostrophecms-public-pages-do-not-describe-the-editing-plane-4hgf</link>
      <guid>https://dev.to/bianliang/apostrophecms-public-pages-do-not-describe-the-editing-plane-4hgf</guid>
      <description>&lt;h1&gt;
  
  
  ApostropheCMS: Public Pages Do Not Describe the Editing Plane
&lt;/h1&gt;

&lt;p&gt;ApostropheCMS combines an in-context administrative interface with a headless REST API. A public site can therefore carry Apostrophe branding, editorial output and an API route while exposing no administrative login to an external scanner. The difference matters when a small title count is used to describe the editing plane.&lt;/p&gt;

&lt;p&gt;A count-only ZoomEye comparison on 2026-11-14 used page 1, page size 1 and &lt;code&gt;sub_type=all&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Matched assets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;app="ApostropheCMS"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title="ApostropheCMS"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The exact app label produced no matches. The title label produced 18. Neither result is a count of public admin interfaces. The zero may mean that the exact application value is not present in the selected data, while the title set may include documentation, agency pages and sites that use Apostrophe for content without exposing the editor.&lt;/p&gt;

&lt;p&gt;Apostrophe's documentation describes a Node.js server, a Vue-based admin UI, in-context editing and a REST API. The login mechanism is used by the admin interface, and the documentation notes that sessions and bearer tokens serve different client patterns. A public page returning content does not reveal whether those authentication paths are reachable or correctly scoped.&lt;/p&gt;

&lt;p&gt;The platform can also run headless, with a separate frontend consuming the API. That pattern removes many visual signs of Apostrophe from the public site. A title search may miss the deployment, while an API endpoint may be present on a hostname with no brand text. The inventory needs host and route evidence, not only visible product names.&lt;/p&gt;

&lt;p&gt;The 18 title matches are small enough to treat as a research queue rather than an exposure count. For each match an analyst can ask whether the site owns the content platform, whether an editor login is public and whether the API is meant to be public. Those questions require authorization and technical verification. The count itself does not answer them.&lt;/p&gt;

&lt;p&gt;When the app and title labels both have limited coverage, the next useful step is to compare known deployments. Collect response headers, script assets, login paths and API behavior from an owned Apostrophe instance. Build a narrowly defined signature and test it against the small known set. Keep any new label provisional until it produces consistent results.&lt;/p&gt;

&lt;p&gt;The absence of an app match is not a low-exposure rejection. A product can be deployed behind a custom frontend, a CDN or an authentication gateway. Conversely, a title match can be a marketing site with no application behind it. The safe interpretation is that the selected fields did not establish the software identity.&lt;/p&gt;

&lt;p&gt;For defenders, the review should separate content exposure from editing exposure. Public content may be intentional. Editor authentication, API keys and unpublished content need a different permission model. A small external count should direct attention to those controls, not replace an inventory of the organization's own CMS hosts and roles.&lt;/p&gt;

&lt;p&gt;The report should say exactly what was observed. Zero exact app matches and 18 exact title matches at a fixed time is reproducible evidence. It is not evidence that Apostrophe has no public admin planes. The gap between those claims is the analysis the article is meant to preserve.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apostrophecms.com/docs/guide/introduction.html" rel="noopener noreferrer"&gt;ApostropheCMS introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apostrophecms.com/docs/reference/api/authentication.html" rel="noopener noreferrer"&gt;ApostropheCMS authentication reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zoomeye</category>
      <category>apostrophecms</category>
      <category>assetinventory</category>
      <category>headlesscms</category>
    </item>
    <item>
      <title>Db2 service and port counts need the same authentication boundary</title>
      <dc:creator>yutianle</dc:creator>
      <pubDate>Fri, 13 Nov 2026 23:02:01 +0000</pubDate>
      <link>https://dev.to/bianliang/db2-service-and-port-counts-need-the-same-authentication-boundary-5em</link>
      <guid>https://dev.to/bianliang/db2-service-and-port-counts-need-the-same-authentication-boundary-5em</guid>
      <description>&lt;h1&gt;
  
  
  Db2 service and port counts need the same authentication boundary
&lt;/h1&gt;

&lt;p&gt;IBM Db2 commonly listens on TCP 50000 for client connections. In a count-only ZoomEye probe on 2026-11-13 around 22:45 UTC, &lt;code&gt;service="db2"&lt;/code&gt; returned 1,519,594 matches and &lt;code&gt;port="50000"&lt;/code&gt; returned 5,043,336. Both used &lt;code&gt;sub_type="all"&lt;/code&gt;, page 1, and page size 1.&lt;/p&gt;

&lt;p&gt;The large difference is a reminder that port numbers are conventions. A service on 50000 is not necessarily Db2, and a Db2 service can be moved or proxied. The service query is a stronger protocol clue, but it still does not prove that a client can authenticate or that a database is misconfigured.&lt;/p&gt;

&lt;p&gt;Db2 is a management and data-plane boundary. A reachable listener can reveal connection behavior, service names, or version information depending on configuration. The database accounts, authentication method, network policy, and workload permissions remain separate controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the port proves and what it does not
&lt;/h2&gt;

&lt;p&gt;The port query establishes that the conventional endpoint answered in the index. It does not establish that the process is a Db2 server. It also does not show whether the listener requires a user ID and password, whether TLS is configured, or whether the database is reachable from the internet or only from a collector with a particular vantage point.&lt;/p&gt;

&lt;p&gt;The service query identifies matching protocol behavior. It can include assets on non-default ports, but it may miss a server that does not produce a recognizable banner. The two counts should be used together. A service match on the expected port is higher-confidence evidence than a bare port observation.&lt;/p&gt;

&lt;p&gt;IBM documentation describes 50000 as the standard client port and 50001 as a common SSL port. An inventory should state whether it measured one or both. A total that mixes secure and non-secure endpoints without that distinction is harder to act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the listener and the database separately
&lt;/h2&gt;

&lt;p&gt;The first review is network placement. Restrict the listener to the application networks that need database access. Avoid exposing a shared database service directly to the internet. If remote access is required, place it behind an approved access path and monitor the connection source.&lt;/p&gt;

&lt;p&gt;The second review is authentication and transport. Confirm whether TLS is required, which certificates are trusted, and how client identities are mapped to database users. Review account policy and least privilege separately. A listener with encrypted transport can still front an overprivileged account.&lt;/p&gt;

&lt;p&gt;The third review is service ownership. Record the instance, database name, application, backup path, and decommission state. Retired databases often leave a listener or a firewall rule behind. A scan can find the port but cannot tell whether the business still depends on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn the number into a bounded queue
&lt;/h2&gt;

&lt;p&gt;Use the service query for a higher-confidence candidate list and the port query for a broader reachability check. For each owned candidate, capture the host, port, protocol classification, TLS status, authentication policy, and owner. Compare 50000 and 50001 if both are relevant.&lt;/p&gt;

&lt;p&gt;Run a connection test from an unauthorized source and verify that it fails before authentication. Then test the intended application path. Do not attempt password guessing or data access beyond the approved test. If the database is retired, remove the listener and the network rule together, then re-run the same query.&lt;/p&gt;

&lt;p&gt;The 1.5 million service matches and 5.0 million port matches are not a claim that every endpoint is an exposed database. They show why a default database port requires careful interpretation. The security decision belongs to the owner who can confirm the process and the authentication boundary.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ibm.com/docs/en/ias?topic=database-connecting-db2" rel="noopener noreferrer"&gt;IBM: Connecting to your Db2 database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ibm.com/docs/en/sig-and-i/11.0.0?topic=configuration-determining-correct-service-listening-port-service-name" rel="noopener noreferrer"&gt;IBM: Determining the correct service listening port and service name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zoomeye</category>
      <category>db2</category>
      <category>databasesecurity</category>
    </item>
  </channel>
</rss>
