Base · Medium

CWE-208: Observable Timing Discrepancy

Two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, su...

CWE-208 · Base Level ·9 CVEs

Description

Two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, such as whether a particular operation was successful or not.

In security-relevant contexts, even small variations in timing can be exploited by attackers to indirectly infer certain details about the product's internal operations. For example, in some cryptographic algorithms, attackers can use timing differences to infer certain properties about a private key, making the key easier to guess. Timing discrepancies effectively form a timing side channel.

Potential Impact

Confidentiality, Access Control

Read Application Data, Bypass Protection Mechanism

Demonstrative Examples

Consider an example hardware module that checks a user-provided password to grant access to a user. The user-provided password is compared against a golden value in a byte-by-byte manner.
Bad
always_comb @ (posedge clk)
                    
                    begin
		    
                      assign check_pass[3:0] = 4'b0;
                      for (i = 0; i < 4; i++) begin
		      
                    	if (entered_pass[(i*8 - 1) : i] eq golden_pass([i*8 - 1) : i])
			
			  assign check_pass[i] = 1;
                    	  continue;
			
                    	else
			
                    	  assign check_pass[i] = 0;
                    	  break;
			
                    	end
		      
                      assign grant_access = (check_pass == 4'b1111) ? 1'b1: 1'b0;
		    
                    end
Since the code breaks on an incorrect entry of password, an attacker can guess the correct password for that byte-check iteration with few repeat attempts.
To fix this weakness, either the comparison of the entire string should be done all at once, or the attacker is not given an indication whether pass or fail happened by allowing the comparison to run through all bits before the grant_access signal is set.
Good
always_comb @ (posedge clk)
		  begin
		  
                    assign check_pass[3:0] = 4'b0;
               	    for (i = 0; i < 4; i++) begin
		    
               	      if (entered_pass[(i*8 - 1) : i] eq golden_pass([i*8 -1) : i])
		      
               		assign check_pass[i] = 1;
               		continue;
		      
               	      else
		      
               		assign check_pass[i] = 0;
               		continue;
		      
               	      end
		    
               	    assign grant_access = (check_pass == 4'b1111) ? 1'b1: 1'b0;
		  
		  end
In this example, the attacker observes how long an authentication takes when the user types in the correct password.
When the attacker tries their own values, they can first try strings of various length. When they find a string of the right length, the computation will take a bit longer, because the for loop will run at least once. Additionally, with this code, the attacker can possibly learn one character of the password at a time, because when they guess the first character right, the computation will take longer than a wrong guesses. Such an attack can break even the most sophisticated password with a few hundred guesses.
Bad
def validate_password(actual_pw, typed_pw):
		 
                   if len(actual_pw) <> len(typed_pw):
		   return 0
                   for i in len(actual_pw):
		   if actual_pw[i] <> typed_pw[i]:
		   return 0
                   
                   return 1
Note that in this example, the actual password must be handled in constant time as far as the attacker is concerned, even if the actual password is of an unusual length. This is one reason why it is good to use an algorithm that, among other things, stores a seeded cryptographic one-way hash of the password, then compare the hashes, which will always be of the same length.

Real-World CVE Examples

CVE IDDescription
CVE-2019-10071Java-oriented framework compares HMAC signatures using String.equals() instead of a constant-time algorithm, causing timing discrepancies
CVE-2019-10482Smartphone OS uses comparison functions that are not in constant time, allowing side channels
CVE-2014-0984Password-checking function in router terminates validation of a password entry when it encounters the first incorrect character, which allows remote attackers to obtain passwords via a brute-force att
CVE-2003-0078SSL implementation does not perform a MAC computation if an incorrect block cipher padding is used, which causes an information leak (timing discrepancy) that may make it easier to launch cryptographi
CVE-2000-1117Virtual machine allows malicious web site operators to determine the existence of files on the client by measuring delays in the execution of the getSystemResource method.
CVE-2003-0637Product uses a shorter timeout for a non-existent user than a valid user, which makes it easier for remote attackers to guess usernames and conduct brute force password guessing.
CVE-2003-0190Product immediately sends an error message when a user does not exist, which allows remote attackers to determine valid usernames via a timing attack.
CVE-2004-1602FTP server responds in a different amount of time when a given username exists, which allows remote attackers to identify valid usernames by timing the server response.
CVE-2005-0918Browser allows remote attackers to determine the existence of arbitrary files by setting the src property to the target filename and using Javascript to determine if the web page immediately stops loa

Taxonomy Mappings

  • PLOVER: — Timing discrepancy infoleak

Frequently Asked Questions

What is CWE-208?

CWE-208 (Observable Timing Discrepancy) is a software weakness identified by MITRE's Common Weakness Enumeration. It is classified as a Base-level weakness. Two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, su...

How can CWE-208 be exploited?

Attackers can exploit CWE-208 (Observable Timing Discrepancy) to read application data, bypass protection mechanism. This weakness is typically introduced during the Architecture and Design, Implementation, Operation phase of software development.

How do I prevent CWE-208?

Follow secure coding practices, conduct code reviews, and use automated security testing tools (SAST/DAST) to detect this weakness early in the development lifecycle.

What is the severity of CWE-208?

CWE-208 is classified as a Base-level weakness (Medium abstraction). It has been observed in 9 real-world CVEs.