Skip to main content

Non-encrypted confidential information - Base 64

Description

Base64 credentials are stored in the source code.

Impact

Obtain service credentials.

Recommendation

  • Change the login credentials that were compromised.
  • Purge git history of affected sensitive data.
  • Upload sensitive data from secure sources such as: key vault services, configuration files that are properly encrypted.

Threat

Attacker with access to source code from the Internet.

Expected Remediation Time

⌚ 60 minutes.

Score

Default score using CVSS 3.1. It may change depending on the context of the vulnerability.

Base

  • Attack vector: N
  • Attack complexity: L
  • Privileges required: L
  • User interaction: N
  • Scope: U
  • Confidentiality: L
  • Integrity: N
  • Availability: N

Temporal

  • Exploit code madurity: X
  • Remediation level: X
  • Report confidence: X

Result

  • Vector string: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N/E:X/RL:X/RC:X
  • Score:
    • Base: 4.3
    • Temporal: 4.3
  • Severity:
    • Base: Medium
    • Temporal: Medium

Code Examples

Compliant code

The encrypted values of sensitive information should be stored in the code

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password_hash = db.Column(db.String(128))

@property
def password(self):
raise AttributeError('password not readable')
@password.setter
def password(self, password):
self.password_hash = bcrypt.hashpw('password', bcrypt.gensalt())

Non compliant code

The server could have a user class that stores the passwords in Base64

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password_hash = db.Column(db.String(128))

@property
def password(self):
raise AttributeError('password not readable')
@password.setter
def password(self, password):
self.password_hash = base64.b64encode('password')

Requirements