crypto code - insomnihack.ch · street cred wrote and reviewed some crypto code like code for...

Post on 29-Jun-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Crypto Code The 9 circles of testing

JP Aumasson, Kudelski Security

Why it’s hard

You need to know crypto and software

Methodologies aren’t documented

Tools aren’t always available

Street cred

Wrote and reviewed some crypto code

Like code for millions unpatchable devices

Made many mistakes

Tested many tests

What do we want?Functional testing & security testing

Functional testing

Valid inputs give valid output

Invalid inputs trigger appropriate errors

Goal: test all execution paths

Security testing

Program can’t be abused

Doesn’t leak secrets

Overlaps with functional testing

What we’re testing

Code against code or against specs

Usually C code, which doesn’t help

Code against code

Easiest case

When porting to a new language/platform

You’ll assume that the ref code is correct (Though it’s probably not)

Can generate all test vectors you want

Code against specs

Often occurs with standards (ex: SHA-3)

Only a handful of test vectors, if any

Specs can be incomplete or incorrect

Try to have 2 independent implementers

The 9 circles

From most basic to most sophisticated

You may not need all of those

The “what” more than the ”how”

I probably missed important points

1. Test vectorsUnit-test ciphers, hashes, parsers, etc.

Maximize code coverage by varying inputs lengths and values

Make coherence tests, as in BRUTUS https://github.com/mjosaarinen/brutus

To avoid storing thousands values, record only a checksum (as in SUPERCOP)

1. Test vectorsAgainst specs, test vectors less useful

Bug in BLAKE ref code unnoticed for 7 years

/* compress remaining data filled with new bits */- if( left && ( ((databitlen >> 3) & 0x3F) >= fill ) ) {+ if( left && ( ((databitlen >> 3) ) >= fill ) ) { memcpy( (void *) (state->data32 + left), (void *) data, fill );

Found by a careful user (thanks!)

NIST’s Cryptographic Algorithm Validation Program http://csrc.nist.gov/groups/STM/cavp/

2. Basic software testsAgainst memory corruption, leaks, etc.

Secure coding very basics

Static analyzers (Coverity, PREfast, etc.)

Valgrind, Clang sanitizers, etc.

Dumb fuzzing (afl-fuzz, etc.)

2. Basic software testsMost frequent, can find high impact bugs (Heartbleed, gotofail)

http://www.openwall.com/lists/oss-security/2015/10/16/1

3. Invalid use

Test that it triggers the expected error

Invalid values, malformed input, etc.

For length parameters, parsers

3. Invalid useArgon2 omitted a parameter range check:

/* Validate memory cost */ if (ARGON2_MIN_MEMORY > context->m_cost) { return ARGON2_MEMORY_TOO_LITTLE; }

+ if (context->m_cost < 8*context->lanes) {+ return ARGON2_MEMORY_TOO_LITTLE;+ }+

4. Optional featuresDon’t forget features buried under #ifdefs

In OpenSSL’s DES optional weak key check

http://marc.info/?l=openbsd-tech&m=144472550016118

Yesterday

5. Randomness

Hard to catch bugs

Statistical tests are a bare minimum

Ensure distinct outputs across reboots

And across devices (see mining p’s & q’s)

5. RandomnessA classic: Debian’s PRNG bug (2008)

/* DO NOT REMOVE THE FOLLOWING CALL TO MD_Update()! */if (!MD_Update(m, buf, j)) goto err;/* * We know that line may cause programs such as purify and valgrind * to complain about use of uninitialized data. The problem is not, * it's with the caller. Removing that line will make sure you get * really bad randomness and thereby other problems such as very * insecure keys. */

OpenSSH keys ended up with 15-bit entropy

6. Timing leaksWhen execution time depends on secrets

Avoid branchings, beware memcmp, etc.

Check the assembly, not just C source

Langley’s ctgrind https://github.com/agl/ctgrind https://github.com/veorq/misc/blob/master/ctgrind_valgrind-3.11.0.patch See also openssl/include/internal/constant_time_locl.h

7. FuzzingDumb fuzzing for exploring parameters’ space, parsed formats, bignum arithmetic

CVE-2015-3193 in OpenSSL’s BN_mod_exp

CVE-2016-1938 in NSS’ mp_div/_exptmod

Integer overflow in Argon2 https://github.com/P-H-C/phc-winner-argon2/issues/5

7. Fuzzing

Smart fuzzing, designed for specific APIs

What Cryptosense is doing for PKCS#11

More for high-level protocols than algorithms

8. Verification

Mathematically proven correctness

Cryptol language http://cryptol.net/ http://galois.com/ + SAW to extract models from LLVM, Java

INRIA’s verified TLS https://mitls.org/

Verified security: LangSec?

9. Physical testingTest for side channels, fault resilience

As applied to smart cards or game consoles

Conclusions

ConclusionsPareto: test vectors will spot most bugs

But bugs on the (fat) tail can be critical

Conclusions

Conclusions

https://discovery.cryptosense.com/analyze/troopers.de/d4c7579

ConclusionsFirst do basic automated tests

Machine don’t replace human review though

Few capable people/companies for crypto

Make your code/APIs test/review-friendly

See coding rules on https://cryptocoding.net

Thanks!

top related