const downloadFile = blobstoreRouter.get('/blobstore/download/:filename', (req, res) => { var localFile = path.join(__dirname, '..', escape(req.params.filename)); var file = require('fs').createWriteStream(localFile); try { s3.getObject({ Bucket: process.env.BUCKET, Key: req.params.filename }).createReadStream().pipe(file); fs.readdir('src', (_err, files) => { files.forEach(file => { console.log(file); logger.info(file); }); }); res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); res.sendFile(file); } catch (err) { logger.error('Error downloading the file ' + err); res.send('Failed'); } });Checkmarx da una advertencia en la línea res.sendFile(file);
Agregué el encabezado HSTS también para lo mismo, pero no estoy seguro de si eso también funciona. Por favor guíame a través de ambos. Gracias por adelantado
Ni agregar HSTS ni escapar de req.params.filename mitigará la vulnerabilidad de Path Traversal. Para comprender qué es Path Traversal, aquí hay una publicación de blog que quizás desee leer:
https://nodejs.org/en/knowledge/file-system/security/introduction/
Hay muchas formas de resolver este hallazgo de seguridad, pero Checkmarx reconoce el uso de métodos de saneamiento como replace()
Elimine los caracteres potencialmente maliciosos que permitirán que un atacante atraviese diferentes rutas de su depósito S3:
var localFile = path.join(__dirname, '..', escape(req.params.filename.replace(/^(\.\.(\/|\\|$))+/, ''))); var file = require('fs').createWriteStream(localFile); try { s3.getObject({ Bucket: process.env.BUCKET, Key: req.params.filename.replace(/^(\.\.(\/|\\|$))+/, '') }).createReadStream().pipe(file); fs.readdir('src', (_err, files) => { files.forEach(file => { console.log(file); logger.info(file); }); });