{"id":1500,"date":"2026-10-24T23:05:22","date_gmt":"2026-10-24T23:05:22","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1500"},"modified":"2026-10-24T23:05:22","modified_gmt":"2026-10-24T23:05:22","slug":"auditing-suid-binaries-file-capabilities-vps","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/","title":{"rendered":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks"},"content":{"rendered":"<p class=\"wp-block-paragraph\">A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: <code>\/usr\/bin\/su<\/code>, <code>\/usr\/bin\/mount<\/code> and <code>\/usr\/bin\/chsh<\/code> are standard privilege-escalation footholds after a compromise. Finding them takes one command. Auditing them \u2014 verifying nothing breaks when the bit comes off, and catching file capabilities that <code>find -perm -4000<\/code> never shows \u2014 takes twenty minutes.<\/p>\n\n<p class=\"wp-block-paragraph\">This audit was run against a minimal web-facing <a href=\"https:\/\/virtualserversvps.com\/\">VPS<\/a> serving nginx and PHP-FPM. Everything is read-only until the removal section, so it is safe on a production box; the package step uses dpkg, with an rpm equivalent.<\/p>\n\n<h2 class=\"wp-block-heading\">Why the SUID bit alone is an incomplete picture<\/h2>\n\n<p class=\"wp-block-paragraph\">A SUID binary runs with its owner&#8217;s privileges. A file capability grants a subset of root privileges without SUID \u2014 <code>cap_net_bind_service<\/code> lets an unprivileged process bind port 80, <code>cap_setuid<\/code> lets it change its own UID, which is most of what an attacker needs. Capabilities live in an extended attribute, so <code>find -perm -4000<\/code> reports nothing.<\/p>\n\n<p class=\"wp-block-paragraph\">A third category matters more in practice: binaries marked <code>+s<\/code> inside a tarball-extracted application directory, where ownership may be a non-root UID but the binary still runs with that UID&#8217;s rights. All three belong in one inventory.<\/p>\n\n<h2 class=\"wp-block-heading\">Enumerating SUID and SGID files<\/h2>\n\n<p class=\"wp-block-paragraph\">Start from both ends \u2014 filesystem and package database. The difference separates &#8220;installed by a package&#8221; from &#8220;arrived some other way&#8221;, and the second set is where surprises live.<\/p>\n\n<pre class=\"wp-block-code\"><code># all SUID\/SGID binaries, with owner and capability, excluding \/proc and \/sys\nfind \/ -xdev \\( -perm -4000 -o -perm -2000 \\) -type f \\\n     -printf '%m %u:%g %p\\n' 2&gt;\/dev\/null | sort -k3\n\n# file capabilities (extended attribute security.capability)\ngetcap -r \/ 2&gt;\/dev\/null\n\n# files that changed since the package was installed (deb)\ndpkg -V 2&gt;\/dev\/null | head -40<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><code>find<\/code> returned 13 SUID and 8 SGID files, all root-owned and package-owned except a <code>chrome-sandbox<\/code> under a leftover application directory, extracted from a tarball seven months earlier and owned by no package.<\/p>\n\n<p class=\"wp-block-paragraph\">The <code>-xdev<\/code> flag matters: without it <code>find \/<\/code> descends into network volumes and <code>\/proc<\/code>, producing false positives and taking minutes. Run it once per filesystem.<\/p>\n\n<h2 class=\"wp-block-heading\">Reading the file capability set<\/h2>\n\n<p class=\"wp-block-paragraph\"><code>getcap -r \/<\/code> prints each file with a capability and whether it is <code>ep<\/code> (effective + permitted), <code>p<\/code> (permitted only, must be raised by the program) or <code>ei<\/code> (inheritable). The distinction matters: <code>cap_net_raw+p<\/code> on <code>ping<\/code> is benign because ping raises it deliberately, while <code>cap_setuid+ep<\/code> on any binary is effectively root.<\/p>\n\n<pre class=\"wp-block-code\"><code>$ getcap -r \/ 2&gt;\/dev\/null\n\/usr\/bin\/ping cap_net_raw=ep\n\/usr\/bin\/mtr-packet cap_net_raw=ep\n\/usr\/lib\/nmap\/nmap cap_net_raw,cap_net_admin,cap_d_sys_admin=eip<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">The nmap line is the classic problem: <code>cap_net_admin<\/code> lets a process reconfigure interfaces and firewall rules without a root shell. A web server does not need nmap, and removing it removes the capability. Where one is genuinely needed, use the narrowest form: <code>setcap cap_net_bind_service=+ep \/usr\/local\/bin\/app<\/code> instead of running as root.<\/p>\n\n<p class=\"wp-block-paragraph\">Check running processes too, since a service manager can grant capabilities the binary does not carry on disk: <code>grep Cap \/proc\/&lt;pid&gt;\/status<\/code> shows <code>CapEff<\/code>, and <code>capsh --decode=00000000a80425fb<\/code> expands the hex. A service with <code>cap_sys_admin<\/code> in <code>CapEff<\/code> is one kernel bug from full compromise.<\/p>\n\n<h2 class=\"wp-block-heading\">The inventory table<\/h2>\n\n<p class=\"wp-block-paragraph\">The audit produces a table to review whenever a package update touches one of these paths. Reduced form for a small web host \u2014 every entry needs a stated reason:<\/p>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Path<\/th><th>Mode<\/th><th>Privilege<\/th><th>Package-owned<\/th><th>Keep?<\/th><\/tr><\/thead><tbody><tr><td><code>\/usr\/bin\/passwd<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>passwd<\/td><td>yes \u2014 users change passwords<\/td><\/tr><tr><td><code>\/usr\/bin\/chsh<\/code>, <code>chfn<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>passwd<\/td><td>no on a server<\/td><\/tr><tr><td><code>\/usr\/bin\/su<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>util-linux<\/td><td>no \u2014 sudo is used instead<\/td><\/tr><tr><td><code>\/usr\/bin\/mount<\/code>, <code>umount<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>util-linux<\/td><td>no \u2014 no fstab user mounts<\/td><\/tr><tr><td><code>\/usr\/bin\/newgrp<\/code>, <code>gpasswd<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>passwd<\/td><td>no<\/td><\/tr><tr><td><code>\/usr\/bin\/ping<\/code><\/td><td>cap_net_raw=ep<\/td><td>file capability<\/td><td>iputils-ping<\/td><td>yes<\/td><\/tr><tr><td><code>\/usr\/lib\/openssh\/ssh-keysign<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>openssh-client<\/td><td>only if host-based auth used<\/td><\/tr><tr><td><code>\/opt\/app\/chrome-sandbox<\/code><\/td><td>4755<\/td><td>SUID root<\/td><td>none<\/td><td>no \u2014 unowned, remove<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">Removing the bit is reversible with <code>chmod u+s<\/code> and keeps updates working. The risk is a silent dependency: a cron job using <code>su<\/code>, a script calling <code>mount<\/code> via fstab <code>user<\/code>.<\/p>\n\n<h2 class=\"wp-block-heading\">Verifying nothing breaks: remove one bit at a time<\/h2>\n\n<p class=\"wp-block-paragraph\">Remove one bit, wait a day of normal operation, check the journal for <code>Permission denied<\/code> or <code>Operation not permitted<\/code>, then continue. Batch removal makes failures unattributable \u2014 and they surface at 03:00 in a backup script.<\/p>\n\n<pre class=\"wp-block-code\"><code># remove the SUID bit (reversible with chmod u+s)\nchmod u-s \/usr\/bin\/su \/usr\/bin\/chsh \/usr\/bin\/chfn \/usr\/bin\/newgrp \/usr\/bin\/gpasswd\nchmod u-s \/usr\/bin\/mount \/usr\/bin\/umount\n\n# verify\nfind \/ -xdev -perm -4000 -type f 2&gt;\/dev\/null\n\n# watch for fallout for 24h\njournalctl -b --since \"24 hours ago\" -p warning | grep -iE \"permission denied|not permitted\" | head<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Removing seven bits dropped the inventory from 13 to 6 with zero journal errors over seven days. The one that would have broken was <code>su<\/code>: a monitoring script ran <code>su -s \/bin\/sh postgres<\/code> and failed with <code>su: Authentication failure<\/code>, not a permission error. SUID removals on <code>su<\/code> and <code>mount<\/code> surface as authentication or filesystem errors.<\/p>\n\n<p class=\"wp-block-paragraph\">To clear a capability instead, use <code>setcap -r \/path\/to\/binary<\/code> and verify with <code>getcap -r \/<\/code>; removing the package is cleaner when the binary has no other purpose.<\/p>\n\n<h2 class=\"wp-block-heading\">Using the inventory as a baseline for drift detection<\/h2>\n\n<p class=\"wp-block-paragraph\">A static list is only useful if it is checked. A nightly diff against a stored baseline catches the common case \u2014 a new SUID file after a deploy or tarball extraction \u2014 without the CPU cost of hashing the filesystem.<\/p>\n\n<pre class=\"wp-block-code\"><code># create the baseline once, after the audit is clean\nfind \/ -xdev \\( -perm -4000 -o -perm -2000 \\) -type f -printf '%m %u:%g %p\\n' 2&gt;\/dev\/null | sort &gt; \/var\/lib\/suid-baseline.txt\n\n# daily diff (cron or systemd timer)\ndiff -u \/var\/lib\/suid-baseline.txt \/dev\/null | sort) \\\n  &amp;&amp; echo \"suid inventory unchanged\" \\\n  || logger -t suidaudit \"SUID inventory changed - review immediately\"<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Run the same diff for <code>getcap -r \/<\/code>; capability changes do not always add a file. Updating the baseline must be a reviewed step \u2014 the value is in the human review of the delta.<\/p>\n\n<p class=\"wp-block-paragraph\">Add a periodic <code>dpkg -V<\/code> for binaries modified in place: <code>5<\/code> means the checksum changed, <code>U<\/code> ownership, <code>M<\/code> mode. A SUID binary also flagged <code>5<\/code> is the highest-priority finding in any audit.<\/p>\n\n<h2 class=\"wp-block-heading\">Tightening what remains<\/h2>\n\n<ul class=\"wp-block-list\"><li>Bind low ports with <code>cap_net_bind_service<\/code> on the app binary instead of running as root, or proxy from nginx on 80 to an unprivileged port.<\/li><li>Replace <code>su<\/code>-based admin scripts with <code>sudo -u<\/code> rules scoped to a specific command, which keeps an audit trail in <code>\/var\/log\/auth.log<\/code>.<\/li><li>Mount <code>\/tmp<\/code> and <code>\/dev\/shm<\/code> with <code>nosuid,nodev,noexec<\/code> \u2014 this alone neutralises most dropper techniques.<\/li><li>Enable <code>fs.protected_symlinks=1<\/code> and <code>fs.protected_hardlinks=1<\/code> (default on modern kernels) and confirm with <code>sysctl -n<\/code>.<\/li><li>For services, <code>NoNewPrivileges=yes<\/code> makes SUID binaries inside the service a dead end.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\"><code>nosuid<\/code> catches the most: a SUID binary written into <code>\/tmp<\/code> gains nothing. Verify with <code>findmnt -no OPTIONS \/tmp<\/code>.<\/p>\n\n<h2 class=\"wp-block-heading\">A one-page audit routine<\/h2>\n\n<ol class=\"wp-block-list\"><li><code>find<\/code> for SUID\/SGID with <code>-xdev<\/code>, diff against the stored baseline.<\/li><li><code>getcap -r \/<\/code>, diff against the stored capability baseline.<\/li><li><code>dpkg -V<\/code> \/ <code>rpm -Va<\/code> for modified package files; investigate every <code>5<\/code> flag.<\/li><li>Review any unowned SUID binary \u2014 the tarball-extracted one is the usual finding.<\/li><li>Confirm <code>nosuid,nodev,noexec<\/code> on <code>\/tmp<\/code> and <code>\/dev\/shm<\/code>.<\/li><li>For each remaining entry, write down why it exists. An entry without a reason is a candidate for removal.<\/li><\/ol>\n\n<p class=\"wp-block-paragraph\">Ten minutes on a small host once baselines exist, and the part of <a href=\"https:\/\/virtualserversvps.com\/\">server configuration<\/a> that pays off after an intrusion attempt rather than before.<\/p>","protected":false},"excerpt":{"rendered":"<p>A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: \/usr\/bin\/su, \/usr\/bin\/mount and \/usr\/bin\/chsh are standard privilege-escalation footholds after a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-1500","post","type-post","status-publish","format-standard","hentry","category-security-compliance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks - Virtual Servers VPS Blog<\/title>\n<meta name=\"description\" content=\"A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: \/usr\/bin\/su, \/usr\/bin\/mount and \/usr\/bin\/chsh are\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks\" \/>\n<meta property=\"og:description\" content=\"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-24T23:05:22+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/\",\"name\":\"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-10-24T23:05:22+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"description\":\"A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: \/usr\/bin\/su, \/usr\/bin\/mount and \/usr\/bin\/chsh are\",\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/\",\"name\":\"Virtual Servers VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\",\"name\":\"Virtual-Servers-Vps-Editor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"caption\":\"Virtual-Servers-Vps-Editor\"},\"sameAs\":[\"https:\/\/virtualserversvps.com\/blog\"],\"url\":\"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks - Virtual Servers VPS Blog","description":"A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: \/usr\/bin\/su, \/usr\/bin\/mount and \/usr\/bin\/chsh are","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/","og_locale":"en_US","og_type":"article","og_title":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks","og_description":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks","og_url":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-10-24T23:05:22+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/","url":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/","name":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-10-24T23:05:22+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"description":"A stock Debian 12 install has 13 files with the SUID bit set, and several are unneeded on a server: \/usr\/bin\/su, \/usr\/bin\/mount and \/usr\/bin\/chsh are","breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/auditing-suid-binaries-file-capabilities-vps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Auditing SUID Binaries and File Capabilities on a VPS: Inventory, Removal and Drift Checks"}]},{"@type":"WebSite","@id":"https:\/\/virtualserversvps.com\/blog\/#website","url":"https:\/\/virtualserversvps.com\/blog\/","name":"Virtual Servers VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0","name":"Virtual-Servers-Vps-Editor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","caption":"Virtual-Servers-Vps-Editor"},"sameAs":["https:\/\/virtualserversvps.com\/blog"],"url":"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/"}]}},"_links":{"self":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1500","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/comments?post=1500"}],"version-history":[{"count":4,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1500\/revisions"}],"predecessor-version":[{"id":1506,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1500\/revisions\/1506"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}