SSH Communications Security Addresses an Improper Input Validation Vulnerability in PrivX (CVE- 2024-30170)

 
 

Summary

PrivX versions between 22.0-33.0 perform improper input validation on a few REST API endpoints. This allows an authenticated user to bypass data read access controls and exfiltrate information normally not available. With a preliminary  CVE score of 4.3, this vulnerability may pose a moderate security risk to affected PrivX deployments.

 

Impact

A successful attack can lead to the attacker extracting data from the PrivX database or causing database service level degradation or denial of service. 


Attack does not enable plaintext credentials leak. Attacker is not able to modify database contents nor gain target resource access via this vulnerability.


There are no known publicly available exploits for this vulnerability. 

 

Remediation

The vulnerability is fixed in PrivX minor versions 33.1, 32.3, 31.3 and later, major version 34.0 and later, We recommend you upgrade your PrivX to a fixed version. A mitigation explained below is available in case upgrade is not possible.
 

Mitigation

The vulnerability can be mitigated in all affected PrivX versions by following the instructions below. 

In RPM based deployment.

1. Add the following lines to top of /etc/nginx/conf.d/privx.conf

map $arg_sortdir $sortdir_is_valid {

   default 0;     # By default, consider sortdir as not valid, if query param is found

   asc     1;     # sortdir is valid if it's 'asc'

   desc    1;     # sortdir is valid if it's 'desc'

   ""      1;     # empty is valid

}

 

map $arg_sortkey $sortkey_is_valid {

   default 0;

   id     1;

   user_id 1;

   source_id 1;

   domain 1;

   username 1;

   remote_addr 1;

   type 1;

   created 1;

   updated 1;

   expires 1;

   token_expires 1;

   "" 1;

}

 

2. Add the if blocks to the server block for port 443 between the SSL configuration directives and the include directives in /etc/nginx/conf.d/privx.conf

 

server {

       listen                         443 ssl http2;

       client_max_body_size           1M;

       ssl_protocols                   TLSv1.2;

       ssl_prefer_server_ciphers       on;

       ssl_ciphers                     'AESGCM+EECDH:AESGCM+EDH:AES+EECDH:AES+EDH:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:-DSS:-EDH';

       ssl_session_cache               shared:SSL:10m;

       ssl_certificate                 /etc/nginx/ssl/nginx.crt;

       ssl_certificate_key             /etc/nginx/ssl/nginx.key;    

 

       if ($sortdir_is_valid = 0) {

           # block invalid sortdir param

           return 400;    

       }

       if ($request_uri !~* ^/auth/api/v1/sessionstorage/) {

           # for all other endpoints, allow any sortkey value

           set $sortkey_is_valid 1;

       }

       if ($sortkey_is_valid = 0) {

           # if sortkey is still marked as invalid, block the request

           return 400;

       }

      

       include                         privx/privx-common.conf;

       include                         privx/privx-csp.conf;

       include                         privx/privx-https-location.conf;

}


3. Make the same modification to the server block for localhost port 443:

server {
listen                         443 ssl http2;
       server_name                     localhost localhost6 127.0.0.1 ::1;

       client_max_body_size           1M;

       ssl_protocols                   TLSv1.2;
       ssl_prefer_server_ciphers       on;
       ssl_ciphers      
'AESGCM+EECDH:AESGCM+EDH:AES+EECDH:AES+EDH:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:-DSS:-EDH';
       ssl_session_cache               shared:SSL:10m;
       ssl_certificate                 /etc/nginx/ssl/nginx-internal.crt;
       ssl_certificate_key             /etc/nginx/ssl/nginx-internal.key;

       if ($sortdir_is_valid = 0) {
         # block invalid sortdir param
         return 400;
       }
       if ($request_uri !~* ^/auth/api/v1/sessionstorage/) {
         # for all other endpoints, allow any sortkey value
         set $sortkey_is_valid 1;
       }
       if ($sortkey_is_valid = 0) {
         # if sortkey is still marked as invalid, block the request
         return 400;
       }

       include                         privx/privx-common.conf;
       include                         privx/privx-csp.conf;
       include                         privx/privx-https-location.conf;
}
 
4. Restart nginx service
 
Note: you need to repeat above steps on every node of the PrivX cluster.

In Kubernetes based deployment

1. Add the following annotation to the charts/privx/values.yaml file in the top- level setting ingress.common.annotations
(NOTE: Use correct yaml indentation):

nginx.ingress.kubernetes.io/configuration-snippet: |

       set $sortdir_is_valid 0;

       if ($arg_sortdir = asc) {

         set $sortdir_is_valid 1;

       }

       if ($arg_sortdir = desc) {

         set $sortdir_is_valid 1;

       }

       if ($arg_sortdir = "") {

         set $sortdir_is_valid 1;

       }

       if ($sortdir_is_valid = 0) {

           # block invalid sortdir param

           return 400;

       }

       set $sortkey_is_valid 0;

       if ($request_uri !~* ^/auth/api/v1/sessionstorage/) {

           # for all other endpoints, allow any sortkey value

           set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = id) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = user_id) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = source_id) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = domain) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = username) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = remote_addr) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = type) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = created) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = updated) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = expires) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = token_expires) {

         set $sortkey_is_valid 1;

       }

       if ($arg_sortkey = "") {

         set $sortkey_is_valid 1;

       }

       if ($sortkey_is_valid = 0) {

           # if sortkey is still marked as invalid, block the request

           return 400;

       }

2. Apply the changes by executing the following command:

helm upgrade -f <override files> -n <privx namespace> <release name> <privx charts location>

 

FAQ

 

Am I affected?

If your PrivX version is between 22.0-33.0 released before March 2024, then your PrivX is subject to this vulnerability. We recommend you apply mitigation as soon as possible and upgrade to fixed PrivX versions once they are available.

 

Am I protected by applying the mitigation?

Yes. Your PrivX is protected from the vulnerability by applying the mitigation. But we recommend you upgrade to fixed PrivX versions once they are available.

 

After applying a mitigation to my PrivX, are there any special steps I need to take for future upgrades?

No. You can upgrade to a fixed version of PrivX normally. The mitigation will be overwritten after upgrade as the mitigation is no longer needed in fixed version.

 

What PrivX versions contain the fix?

PrivX 33.1, 32.3, 31.3 and later.

PrivX 34.0 and later.

 

My PrivX version is affected but is out of official support, will I receive a point release for this version?

No. But applying the mitigation will protect you from the vulnerability, and we recommend you upgrade to supported PrivX version as soon as you can.

 

When this CVE will be disclosed?

The CVE is currently confidential to allow enough time for customers to apply mitigation or upgrade. Details of this CVE will be disclosed on 5th of August, 2024.