Follow @Openwall on Twitter for new release announcements and other news
[<prev] [day] [month] [year] [list]
Message-ID: <2ba0f531-c6a7-45eb-a665-685049d915d3@vanrees.org>
Date: Sat, 31 Jan 2026 15:06:10 +0100
From: Maurits van Rees <maurits@...rees.org>
To: oss-security@...ts.openwall.com
Subject: Security incident on plone GitHub org with force pushes

Hi security list,

Let me start with two key takeaways for everyone:
* Regularly check your personal access tokens or other security keys to 
see if new ones have been added that you do not recognize. This may be a 
sign that your account has been compromised.
* Disable force pushes to your default git branches and maintenance 
branches. In a GitHub org you may be able to do this for a whole 
organization with rulesets, otherwise you can do it per repository.

On January 7, there was a security incident in the plone organization on 
gitHub, where someone force pushed malicious code to several 
repositories. Most of this was discovered before it could do damage, but 
some was left undiscovered until later. We reported this to the Plone 
community forum, with an important update after further discoveries. See 
this thread:
https://community.plone.org/t/plone-security-advisory-20260116-attempted-code-insertions-into-github-pull-requests/22770
In this mail I will try to get the main points across from what we have 
learned.

Plone is an open source content management system written in Python and 
JavaScript/NodeJS. We are quite an open community, and lots of people 
can contribute to the core. We have been around for a long time. This 
means there are also people who have not contributed in years, but still 
have write access to the code. This is something we have been planning 
to clean up, without stepping on too many toes.

In this case, someone who used to contribute, did some force pushes to 
several branches of repositories on GitHub. We discovered this because 
some pull requests had an automatic note by GitHub saying a force push 
was done, and then we saw obfuscated Javascript code that we assume to 
be malicious.
We have no reason to distrust the user, so we assume his account was, at 
least partially, taken over by an attacker. We informed him, and he has 
been working with us to get to the bottom of this, supplying info that 
he got from people at GitHub support who have been researching this. So 
thanks!

 From GitHub we heard that they recorded malicious push events to five 
repositories: plone/volto, plone/mockup, plone/plone.app.mosaic, 
plone/critical-css-cli, plone/plonetheme.barceloneta.
One of these was a successful attempt on a master branch. It is this 
commit, marked as being from 18 December, but that date would be wrong:
https://github.com/plone/plone.app.mosaic/commit/3c94aae73ad37b366c47e899c241306df60b686d
This is a standard after-release commit updating the version, but now it 
contains a change to `prettier.config.js`. Locally the diff seemed only 
whitespace, but the malicious code is hidden after a lot of spaces, 
disappearing to the right of my terminal (this might be a git setting I 
have). On GitHub you can see it after clicking an extra button.  I have 
committed a fix on master, removing the code.

If you suspect something like this may have happened at a project you 
feel responsible for, you can look at all branches, sorted by last 
updated date, in this case:
https://github.com/plone/plone.app.mosaic/branches/all
There I recognized the image of the affected user as being the last one 
to edit the master branch, and the last updated date did not match the 
date that was in the commit.
You could also use the GitHub API, and look for PushEvents, like here:
https://api.github.com/repos/plone/plone.app.mosaic/events


For clarity, why was this attack done by force pushes? Because they are 
harder to notice. The user could have done a normal push, but that would 
have been easier to look for.

Anyway, for most repos we already had protection in place, so that the 
main or master branch could not be force pushed to. For the plone gitHub 
organisation, we have since taken extra precautions organization-wide, 
using rulesets. This is not available for all organisations, so you may 
need to do this per repository.

There is now a ruleset in the settings, with two branch rules that are 
selected by default if you create a new rule:  "Restrict deletions" and 
"Block force pushes". I have activated this ruleset on the default 
branch (which would usually be main or master) and on '*.x', which 
matches how we call our maintenance branches.

A second ruleset is one for tags. A new ruleset for tags by default has 
the same rules selected: "restrict deletions" and "block force pushes". 
As extra for tags we have enabled "Restrict updates", so a malicious 
user cannot update a tag to a different commit. But as far as we know, 
this was not attempted.

Finally, some words about the contents of the attack. It targets 
javascript files at the root of the repository, which are usually called 
when building the software. So it seems to target not so much end users 
of the software, but developers.  I will share some info that the 
affected user sent us after his communication with GitHub:

"The malicious code is sophisticated. If the software it targets is 
built, it activates, detaches, and hides within active processes. It 
ensures persistence through shell startup scripts, downloads an RCE 
exploit, gains control over the server, and exfiltrates credentials, 
including API keys, browser profiles and crypto wallets.
In my case, the attackers exploited an active session to plant a 
Personal Access Token (PAT) and waited two months before performing 
these force-pushes."

So, be careful when you have multiple people who can commit to your 
software, and you see unexpected force pushes.

Greetings,

Maurits van Rees
Plone/Zope Security Team
Plone Release Manager

Powered by blists - more mailing lists

Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.