HexBrain

Sifchain · Report #1196917

Path Transversal inside saveContracts.js

N/Astatus
7upvotes
14 May 2021disclosed

How it was found

Reference: https://portswigger.net/web-security/file-path-traversal

Directory traversal (also known as file path traversal) is a web security vulnerability that allows an attacker to read arbitrary files on the server that is running an application. This might include application code and data, credentials for back-end systems, and sensitive operating system files. In some cases, an attacker might be able to write to arbitrary files on the server, allowing them to modify application data or behavior, and ultimately take full control of the server.

Inside https://github.com/Sifchain/sifnode/blob/develop/smart-contracts/scripts/saveContracts.js there's a part of the code which is not sanitized; meaning it could allow a path transversal to happen.

function readFiles(dirname, onFileContent, onError) {
  fs.readdir(dirname, function(err, filenames) {
    if (err) {
      onError("The build/contracts directory does not exist.\n\nMake sure the build directory exists before running this script.\n\nTo create build directory run `truffle deploy --network develop`\n\n");
      return;
    }
    filenames.forEach(function(filename) {
      fs.readFile(dirname + filename, 'utf-8', function(err, content) {  <<<<<< VULNERABLE
        if (err) {
          onError(filename, err);
          return;
        }
        onFileContent(filename, content);
      });
    });
  });
}

Caller:

readFiles("build/contracts/", handleFileContents, handleError);

Explanation:

readFiles() function calls the build/contracts/ path, let' says a file named ../../../../etc/passwd exists inside the folder. Inside readFiles the first part of the script will grab all filenames, meaning it will grab the ../../../../etc/passwdfile. After grabbing the filenames It will proceed to call fs.readFile to each of the files. When fs.readFile happens to ../../../../etc/passwd the call will be something like that:

build/contracts/../../../../etc/passwd

Once executed it will show the passwd file containing all users and password of the machine because /../../../../ will force the path to root.

Impact

This transversal allows an attacker to read arbitrary files on the server.

#Fix

Sanitize the inputs in the filename variable If you are using node or express it is a good idea to follow this https://stackoverflow.com/questions/46718772/how-i-can-sanitize-my-input-values-in-node-js/46719000

Kind regards Caon

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original