Everyone,

Summary:
The CWE Team wishes to consult with software security experts about possible 
deprecation for "CWE-365: Race Condition in Switch" due to no documented cases 
where it can occur. Feedback is welcome to c...@mitre.org by March 31.
CWE-365 was based on The CLASP Application Security Process section 5.4.6, (c) 
2005 Secure Software, Inc. (see https://cwe.mitre.org/about/sources.html). This 
section of the manual covers the state of a switch statement going stale and 
therefore out of sync. This can only occur if the switch's conditional 
expression is evaluated more than once.

After community feedback and review, we have been unable to find an instance 
where the switch statement is evaluated more than once. Therefore, the state of 
the switch statement can only become stale is when multiple threads are 
operating and one interferes with the expression evaluated by the switch. If we 
are talking about the evaluation being done incorrectly due to multiple 
threads, this would be better characterized as CWE-366: Race Condition within a 
Thread.

Details:
CWE-365's demonstrative example is based on C code taken from CLASP. Each case 
statement must be a constant, and it can't be re-evaluated. In the ANSI 
standards we researched (e.g., ISO/IEC 9899:TC3 
http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf), the specific 
standard does not clearly state that the switch is evaluated once. In 
practicality, the evaluation of the switch statement has been proven to only be 
evaluated once across gcc 3.4.1 through 13.0.1 and clang 4.8.1 through 11.2. 
Analysis of the assembly code for this example confirms it is only evaluated 
once, and thus this weakness cannot occur.
We examined the documentation for several languages including Assembler, Ada, 
ALGOL, COBOL, C++, C#, Erlang, Fortran, F#, Go, Haskell, JavaScript, Lisp, PHP, 
Python, Ruby, Rust, and VB.net. This showed that switch statements and their 
equivalent (e.g., match, case, EVALUATE, select case) specify that the 
evaluation is done only once. Some of them say this and then state that it is 
the equivalent to a series of 'if statements' (which would cause the evaluation 
to be completed multiple times). Despite the ambiguity in the documentation for 
some languages, in practice they all evaluate the Boolean statement once. If 
future languages state that this code explicitly evaluates the Boolean for each 
value, this would not be a weakness but the language performing as designed.

Because CWE-365 is not known to identify any real-world issue, we plan to 
deprecate this weakness in CWE 4.7, which is planned to be released in early 
April. If anybody knows of real-world examples in which a switch conditional is 
evaluated more than once, please notify c...@mitre.org by March 31.

Acknowledgements:
We thank the following people who have reported concerns with CWE-365 and 
helped us conduct the analysis, including representatives from code analysis 
vendors, a co-author of the original CLASP document, members of standards 
groups, and others.
Yongchool Ryu, MathWorks
Roberto Bagnara, BUGSENG
Guido Persch, Imagix
John Blattner, Imagix
Paul Anderson, GrammaTech
Fulvio Baccaglini
John Viega
Members of the CWE-Research mailing list, including Jonathan Hood and Steve 
Grubb



Thank you
Steve Battista
703 634-9228

Reply via email to