Top Banner
Cargo Cult Security https://github.com/disaacson/cargo-cu lt-security by Derrick Isaacson
31

Cargo Cult Security 2014_01_18

May 11, 2015

Download

Technology

See common anti-patterns for securing web applications and how to correct them. Learn how to differentiate between authentication, authorization, secrecy, integrity, non-repudiation, and other security goals.

Examples include how:
* a theoretical "secret" banking request is corrupted to pad an attacker's bank account,
* an insecure "session" authentication token is attacked, and
* a "random" XSRF value gives a false sense of security.

Correct principles and patterns are analyzed and compared with common incorrect ones.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Cargo Cult Security 2014_01_18

Cargo Cult Security

https://github.com/disaacson/cargo-cult-security

by Derrick Isaacson

Page 2: Cargo Cult Security 2014_01_18

http://en.wikipedia.org/wiki/Cargo_cult

Page 3: Cargo Cult Security 2014_01_18

Richard Feynman

Page 4: Cargo Cult Security 2014_01_18

Cargo Cult Programming

Ritualistic inclusion of code or patterns that are unnecessary for the task at hand.

• Design patterns• Factory• Wrapper

• Dependency injection• Cryptography• Encryption• Hashing

Page 5: Cargo Cult Security 2014_01_18

The Big Picture

Page 6: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

Page 7: Cargo Cult Security 2014_01_18

Anti-pattern: Authentication

$plainTextId = '100000';

echo '<h4>"Secure" URL for image ' . $plainTextId . '.</h4>';

$cryptTextId = bin2hex(mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $plainTextId, MCRYPT_MODE_OFB, $initializationVector));

$secretImageUrl = "…?secure_id=". $cryptTextId;

echo '<a href="'. $secretImageUrl .'">'.$secretImageUrl.'</a>';

Page 8: Cargo Cult Security 2014_01_18

private_image.php?secure_id=573146feb41e

$cryptTextId = $_GET["secure_id"];

$plainTextId = rtrim(mcrypt_decrypt(MCRYPT_BLOWFISH, $key,hex2bin($cryptTextId), MCRYPT_MODE_OFB,

$initializationVector));

$imageData = file_get_contents("img/". $plainTextId);echo '<img src="data:image/png;base64,‘

. base64_encode($imageData).'">‘;

573146feb41e

100000

Team Photo

Page 9: Cargo Cult Security 2014_01_18

private_image.php?secure_id=573146feb41e

$cryptTextId = $_GET["secure_id"];

$plainTextId = rtrim(mcrypt_decrypt(MCRYPT_BLOWFISH, $key,hex2bin($cryptTextId), MCRYPT_MODE_OFB,

$initializationVector));

$imageData = file_get_contents("img/" . $plainTextId);echo '<img src="data:image/png;base64,‘

. base64_encode($imageData).'">‘;

573146feb41f

100001

attack plan

private_image.php?secure_id=573146feb41f

Page 10: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

Page 11: Cargo Cult Security 2014_01_18

Anti-pattern: Integrity

$aes = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');…

return mcrypt_generic($aes, $data);

$cipher [45] = chr(ord($cipher [45]) ^ ord(".") ^ ord ("0"));

$aes = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');…

return mdecrypt_generic($aes, $data);

Page 12: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

Page 13: Cargo Cult Security 2014_01_18

HMAC$plainTextId = '100000';$hmac = hash_hmac("sha256", $key, $plainTextId);$secretImageUrl = "…?id=". $plainTextId . "&hmac=" . $hmac;

echo '<a href="'. $secretImageUrl .'">' . $secretImageUrl . '</a>';

$plainTextId = $_GET["id"];$signature = $_GET["hmac"];$hmac = hash_hmac("sha256", $key, $plainTextId);if ($hmac == $signature) { $imageData = file_get_contents("img/" . $plainTextId . ".jpg"); echo '<img src="data:image/png;base64,'. base64_encode($imageData)

.'">'; }else { echo '<h4 class="error">Permission Denied!</h4>';}

Permission Denied!

Page 14: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

Page 15: Cargo Cult Security 2014_01_18

Encryption Parameters

Creates cipher textCipher (AES, Blowfish, …) Secret keyData to encryptCBC, ECB, OFB, …Initialization Vector

mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $plainText, MCRYPT_MODE_CBC, $iv);

Page 16: Cargo Cult Security 2014_01_18

Anti-pattern: Encryption Modes

$plainImageData = file_get_contents($file);

$cryptText = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $plainImageData, MCRYPT_MODE_ECB, $initializationVector);

file_put_contents($file . ".encrypted.data", $cryptText);

Page 17: Cargo Cult Security 2014_01_18
Page 18: Cargo Cult Security 2014_01_18

Cipher-block Chaining Mode

$plainImageData = file_get_contents($file);

$cryptText = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $plainImageData, MCRYPT_MODE_CBC, $initializationVector);

file_put_contents($file . ".encrypted.data", $cryptText);

Page 19: Cargo Cult Security 2014_01_18

Encryption Parameters

Creates cipher textCipher (AES, Blowfish, …) Secret keyData to encryptCBC, ECB, OFB, …Initialization Vector

mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $plainText, MCRYPT_MODE_CBC, $iv);

Page 20: Cargo Cult Security 2014_01_18

Anti-pattern: Initialization Vector

$plainText = “Hold";

$cryptText = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $plainText, MCRYPT_MODE_CBC, md5($key));

• Monday: “a8b8f95c46”• Tuesday: “a8b8f95c46”• Wednesday: “a8b8f95c46”• Thursday: “a8b8f95c46”• Friday: “10f32c937a1284db”

Page 21: Cargo Cult Security 2014_01_18

Modes and IVs

• Cipher-block chaining prevents patterns within messages• Correct IV prevents patterns across

messages

Page 22: Cargo Cult Security 2014_01_18

Generating Keys & Initialization Vectors

$key = “koicy37m8ao2nl07";$iv = rand();$cypherText = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plainText, MCRYPT_MODE_CBC, $iv);

• How many bits of key entropy can be contained in 16 alphanumeric characters?• 96 bits!• ~0.00000002% of possible search space

• What initialization vector is really used here?• “\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0”!• PHP Warning: mcrypt_decrypt(): The IV parameter must be as long

as the blocksize in /home/derrick/…/CBC.php on line 27• Use

• $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,

MCRYPT_MODE_CBC);• mcrypt_create_iv($size);

Page 23: Cargo Cult Security 2014_01_18

Anti-pattern: Random Values<form action=""> <label>Donation amount</label> <input type="text" value="10.00"> <?php $csrfToken = rand(); setCookie("csrfToken", $csrfToken); echo "<input type=\"hidden\" value=\"$csrfToken\">“; ?> <input type="submit" value="Submit"></form>

Page 24: Cargo Cult Security 2014_01_18

Finding Linear Congruential Seed

Random random = new Random();long v1 = random.nextInt();long v2 = random.nextInt();for (int i = 0; i < 65536; i++) { long seed = v1 * 65536 + i; if (((seed * multiplier + addend) & mask) >>> 16) == v2) { System.out.println("Seed found: " + seed); break; }}

Page 25: Cargo Cult Security 2014_01_18

Anti-pattern: Psuedo-random Session IDs

<?php $uid = "12345678"; $sessionId = md5($uid . rand() . microtime()); setCookie(“session_id", $sessionId);?>

Really only ~20 bits of entropy.A modern GPU can calculate that in a second!9,12

Page 26: Cargo Cult Security 2014_01_18

HMACs and Secure Random

<form action=""> <label>Donation amount</label> <input type="text" value="10.00"> <?php $csrfToken = openssl_random_pseudo_bytes(32); setCookie("csrfToken", bin2hex($csrfToken)); echo "<input type=\"hidden\" value=\"$csrfToken\">“; ?> <input type="submit" value="Submit"></form>

Do not use sessions! Use HMACs!Seriously.

Page 27: Cargo Cult Security 2014_01_18

No Cargo Cult Security!

1. Identify true security goal.2. Find correct crypto primitive.3. Spend some time to learn about it.4. Write as little of your own crypto code

as possible.

Page 28: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=6325

Page 29: Cargo Cult Security 2014_01_18

Crypto Primitives & Goals

Hash MACHMAC

Symmetric Key

Crypto

Asymmetric Key

Crypto

Digital Signature

Digital Certificate

s

Data Integrity

Data Authentication

Non-repudiation

Confidentiality

Trust

Page 31: Cargo Cult Security 2014_01_18

References

1. http://en.wikipedia.org/wiki/Cargo_cult

2. http://neurotheory.columbia.edu/~ken/cargo_cult.html

3. http://en.wikipedia.org/wiki/Post_hoc_ergo_propter_hoc

4. http://en.wikipedia.org/wiki/Cargo_cult_programming

5. https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=6325

6. http://www.scs.stanford.edu/10au-cs144/notes/

7. http://resources.infosecinstitute.com/cbc-byte-flipping-attack-101-approach/

8. http://security.stackexchange.com/questions/18033/how-insecure-are-phps-rand-functions

9. http://crypto.di.uoa.gr/CRYPTO.SEC/Randomness_Attacks_files/paper.pdf

10. http://security.stackexchange.com/questions/17988/how-insecure-are-non-cryptographic-random-number-generators

11. http://jazzy.id.au/default/2010/09/20/cracking_random_number_generators_part_1.html

12. http://thepasswordproject.com/oclhashcat_benchmarking

13. http://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php

14. https://github.com/disaacson/cargo-cult-security