Skip to main content

Business information leak - Personal Information

Need

Protection of personal information and prevention of unauthorized access to sensitive data

Context

  • Usage of Scala for building scalable and high-performance applications
  • Usage of Play Framework for building web applications
  • Usage of play.api.mvc for handling HTTP requests and responses in Play Framework

Description

Non compliant code

package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {

def index = Action {
val userId = "1234567890"
val userPhone = "123-456-7890"
Ok("User ID: " + userId + ", User Phone: " + userPhone)
}
}

In the above Scala code, sensitive user information, such as the user's ID and phone number, are being hardcoded directly into the source code. This is a serious security vulnerability as it exposes personal information which could be exploited by malicious actors.

The index function in the Application controller is returning an Action that outputs a string containing a hardcoded user ID and phone number. This is a clear violation of privacy as it exposes personal user information.

This kind of practice is strongly discouraged as it can lead to data leaks and other security issues. Instead, sensitive data should be stored securely and should never be hardcoded into the source code.

Steps

  • Remove the storage of real user information in the source code.
  • Implement a secure storage mechanism to store user information.
  • Retrieve user information from a secure data source, such as a database, instead of hardcoding it in the code.
  • Ensure that the access to user information is properly authenticated and authorized.
  • Implement proper access controls to restrict access to user information based on user roles and permissions.
  • Encrypt sensitive user information to protect it from unauthorized access.
  • Regularly review and update the security measures in place to protect user information.

Compliant code

package controllers

import play.api._
import play.api.mvc._
import services.UserService

class Application @Inject()(userService: UserService) extends Controller {

def index = Action { implicit request =>
val userId = userService.getUserId(request)
val userPhone = userService.getUserPhone(request)
Ok("User ID: " + userId + ", User Phone: " + userPhone)
}
}

The original code had a vulnerability where it was storing real user information directly in the source code. This is a serious security risk as it exposes sensitive user information to anyone who has access to the source code.

The fixed code removes the hardcoded user information and instead retrieves it from a secure data source using a UserService. This service is responsible for retrieving the user ID and phone number. The actual implementation of these methods should connect to a secure data source (like a database) and retrieve the user information. This ensures that the user information is not exposed in the source code and is only accessible through a secure and controlled manner.

In addition, the UserService methods take a Request object as a parameter. This allows the methods to authenticate and authorize the request before retrieving the user information. This ensures that only authorized users can access the user information.

Finally, the user information should be encrypted in the secure data source to protect it from unauthorized access. This adds an additional layer of security to protect the user information.

Regular reviews and updates should be made to the security measures in place to ensure that they are up-to-date and effective in protecting user information.

References