Insecure encryption algorithm - SSLContext
Need
Implementation of secure encryption algorithms for SSLContext
Context
- Usage of TypeScript for statically typed JavaScript development
- Usage of Express for building web applications and APIs
- Usage of HTTPS for secure communication over the network
- Usage of fs for file system operations
Description
Non compliant code
import * as express from 'express';
import * as https from 'https';
const app = express();
const options = {
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('public-cert.pem'),
secureProtocol: 'SSLv3' // Vulnerable SSL protocol
};
const server = https.createServer(options, app);
app.get('/', (req, res) => {
res.send('Hello World!');
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
The vulnerability in the provided code is the use of the insecure SSLv3 protocol in the secureProtocol
option when creating the HTTPS server. SSLv3 has been proven to be insecure and susceptible to various attacks, such as POODLE (Padding Oracle On Downgraded Legacy Encryption).
By using SSLv3, the code allows for the possibility of an attacker being able to decrypt the traffic at the back-end level, compromising the confidentiality and integrity of the data being transmitted.
To address this vulnerability, it is recommended to use only secure encryption protocols with secure algorithms, such as TLSv1.2 or higher.
Steps
- Update the secureProtocol option to use a secure encryption algorithm such as TLSv1.2 or higher.
- Replace the SSLv3 protocol with a secure protocol like TLSv1.2 or higher.
- Ensure that the private key and public certificate files are securely stored and accessed.
- Consider using a more secure method to load the private key and public certificate files, such as using environment variables or a secure key management system.
- Test the updated code to ensure that the secure encryption algorithm is being used and the vulnerability has been addressed.
Compliant code
import * as express from 'express';
import * as https from 'https';
import * as fs from 'fs';
const app = express();
const options = {
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('public-cert.pem'),
secureProtocol: 'TLSv1.2' // Updated to use TLSv1.2 protocol
};
const server = https.createServer(options, app);
app.get('/', (req, res) => {
res.send('Hello World!');
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
The fixed code addresses the vulnerability by using a secure encryption algorithm, specifically TLSv1.2.
First, the code imports the necessary modules: express
, https
, and fs
.
Then, an instance of the express
application is created.
The options
object is defined, which includes the key
and cert
properties. These properties specify the private key and public certificate files required for SSL/TLS encryption. The secureProtocol
property is set to 'TLSv1.2'
, ensuring that only the TLS version 1.2 protocol is used.
Next, the https.createServer()
method is called with the options
object and the app
instance. This creates an HTTPS server that will handle secure connections.
The app.get()
method sets up a basic route for the root URL, which will respond with the message "Hello World!".
Finally, the server is set to listen on port 3000, and a message is logged to the console indicating that the server is running.
Overall, this fixed code ensures that only the secure TLSv1.2 protocol is used for encryption, mitigating the vulnerability associated with insecure encryption algorithms.