<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 07 Oct 2026 22:19:47 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-63669</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-63669</link>
      <description>&lt;p&gt;ApostropheCMS is an open-source Node.js content management system. Prior to 4.32.0, the page module&amp;#39;s move() operation fails to enforce the destination parent&amp;#39;s _create permission because its oldParent archive condition disables the check for ordinary moves, allowing an authenticated editor or contributor to use _targetId and _position through the page REST update endpoint to move a controlled page into a restricted subtree and make nudgeNewPeers() updateMany re-rank protected sibling pages. This issue is fixed in version 4.32.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ApostropheCMS is an open-source Node.js content management system. Prior to 4.32.0, the page module&amp;#39;s move() operation fails to enforce the destination parent&amp;#39;s _create permission because its oldParent archive condition disables the check for ordinary moves, allowing an authenticated editor or contributor to use _targetId and _position through the page REST update endpoint to move a controlled page into a restricted subtree and make nudgeNewPeers() updateMany re-rank protected sibling pages. This issue is fixed in version 4.32.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-63669</guid>
    </item>
    <item>
      <title>GHSA-wr5r-wqp2-x4fh — ApostropheCMS: Missing destination-parent authorization in page `move()` allows a low-privileged editor to move and re-…</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-wr5r-wqp2-x4fh</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: apostrophe&lt;/p&gt;
&lt;p&gt;## Summary
ApostropheCMS enforces per-type authorization on pages: a page type may declare `editRole` / `publishRole` (and the core `@apostrophecms/archive-page` does), so a project can have page-type subtrees that only higher-privileged roles are allowed to create or edit within. The `move()` operation is supposed to enforce that a page may only be moved *into* a parent the actor has **create** rights over — this is the same boundary the page-insert route enforces (the insert target is fetched with `.permission(&amp;#39;create&amp;#39;)`).&lt;/p&gt;
&lt;p&gt;A regression in the move authorization guard silently disabled that destination check for every normal move. The guard now reads `(oldParent._id !== parent._id) &amp;amp;&amp;amp; (parent.type !== &amp;#39;@apostrophecms/archive-page&amp;#39;) &amp;amp;&amp;amp; (!parent._create) &amp;amp;&amp;amp; (oldParent.type === &amp;#39;@apostrophecms/archive-page&amp;#39; &amp;amp;&amp;amp; !parent._edit)`. Because the final `&amp;amp;&amp;amp;` clause requires `oldParent.type === &amp;#39;@apostrophecms/archive-page&amp;#39;`, the whole conjunction can only be true while restoring a page *out of the archive*. For any ordinary move (the source page&amp;#39;s old parent is a normal page), that clause is `false`, the entire condition is `false`, and `!parent._create` is never evaluated. The only surviving gate in the whole path is `moved._edit` — i.e. &amp;#34;can the actor edit the page being moved&amp;#34;, which a low-privileged editor legitimately holds for their own ordinary pages.&lt;/p&gt;
&lt;p&gt;The result is that any authenticated user who can edit at least one page can relocate that page **under a parent of a restricte…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: apostrophe&lt;/p&gt;
&lt;p&gt;## Summary
ApostropheCMS enforces per-type authorization on pages: a page type may declare `editRole` / `publishRole` (and the core `@apostrophecms/archive-page` does), so a project can have page-type subtrees that only higher-privileged roles are allowed to create or edit within. The `move()` operation is supposed to enforce that a page may only be moved *into* a parent the actor has **create** rights over — this is the same boundary the page-insert route enforces (the insert target is fetched with `.permission(&amp;#39;create&amp;#39;)`).&lt;/p&gt;
&lt;p&gt;A regression in the move authorization guard silently disabled that destination check for every normal move. The guard now reads `(oldParent._id !== parent._id) &amp;amp;&amp;amp; (parent.type !== &amp;#39;@apostrophecms/archive-page&amp;#39;) &amp;amp;&amp;amp; (!parent._create) &amp;amp;&amp;amp; (oldParent.type === &amp;#39;@apostrophecms/archive-page&amp;#39; &amp;amp;&amp;amp; !parent._edit)`. Because the final `&amp;amp;&amp;amp;` clause requires `oldParent.type === &amp;#39;@apostrophecms/archive-page&amp;#39;`, the whole conjunction can only be true while restoring a page *out of the archive*. For any ordinary move (the source page&amp;#39;s old parent is a normal page), that clause is `false`, the entire condition is `false`, and `!parent._create` is never evaluated. The only surviving gate in the whole path is `moved._edit` — i.e. &amp;#34;can the actor edit the page being moved&amp;#34;, which a low-privileged editor legitimately holds for their own ordinary pages.&lt;/p&gt;
&lt;p&gt;The result is that any authenticated user who can edit at least one page can relocate that page **under a parent of a restricte…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-wr5r-wqp2-x4fh</guid>
    </item>
  </channel>
</rss>
