Path traversal (or directory traversal) is a vulnerability that allows an attacker to read or write arbitrary files on the server that is running an application.
For example, consider an application that loads images via some HTML like the following:
<imgsrc="/load?filename=218.png">
The /load URL takes the filename parameter and returns the contents of the specified file. The image files themselves are stored on disk in the location /var/www/images/. To return an image, the application:
appends the requested filename 218.png to the base directory /var/www/images/,
uses a filesystem API to read the contents of the /var/www/images/218.png file.
This behaviour can be abused by an attacker. An attacker can request the following URL to retrieve an arbitrary file from the server:
If data can be controlled by a user, implement comprehensive input validation for all data that is passed to the file system API, see the Input Validation page.
Use an allow list of paths to validate user-provided data if possible.
Include only alphanumeric characters in an allow list of characters.
If it is necessary to use special characters such as . or /, prevent the use of combinations represented as regular expressions below.
As can be seen, if user_controller_input contains an absolute path, Pathname.join will ignore everything up to the argument with the absolute path. In other words, it will allow an attacker to craft an arbitrary path.
Use a sandbox to obtain or save data.
Implementing the canonical path validation
Use the path.Join function to get a canonical path.