Summary

Insufficient input validation allowed a directory traversal vulnerability. Any admin config and file readable by the app can be retrieved by the attacker. Furthermore, some files can also be moved or deleted.

Product

fossasia/susi_server

Tested Version

Commit d27ed0f5

Details

The GetImageServlet API endpoint accepts a user-controlled image_path that is used to build the path to a stored image. The content that is stored at the path image_path is then returned to the user, but image_path is not sanitized which allows directory traversal and arbitrary file reads.

String image_path = post.get("image",""); // <- user-controlled
imageFile = new File(DAO.data_dir  + File.separator + "image_uploads" + File.separator + image_path);
ByteArrayOutputStream data = new ByteArrayOutputStream();
InputStream is = new BufferedInputStream(new FileInputStream(imageFile));
// `is` is written to `data`
ServletOutputStream sos = response.getOutputStream();
sos.write(data.toByteArray()); // <- write content back to user

There are further similar vulnerabilities that all have been fixed by ensuring that directory traversal is not possible anymore.
For further information please visit my research article that shows how to escalate an arbitrary file write to remote code execution (RCE).

Impact

Remote code execution as shown in my research article.

CVE

CVE-2020-4039

Github Advisories

GHSA-wcm4-2jp5-q269

Coordinated Disclosure Timeline

  • 2020-03-06: Asked to open a Github security advisory.
  • 2020-03-10: Invited to Github security advisory.
  • 2020-05-13: Issue is patched.
  • 2020-06-08: CVE is assigned.
  • 2020-10-15: Advisory is published.

Credit

This issue was discovered and reported by @intrigus-lgtm.

Contact

You can contact the ISL at isl@intrigus.org. Please include a reference to ISL-2020-001 in any communication regarding this issue.