Secure Coding Patterns Andreas Hallberg, TrueSec Trust - - PowerPoint PPT Presentation

secure coding patterns
SMART_READER_LITE
LIVE PREVIEW

Secure Coding Patterns Andreas Hallberg, TrueSec Trust - - PowerPoint PPT Presentation

Secure Coding Patterns Andreas Hallberg, TrueSec Trust Domain-Driven Security The Untrusted Pattern Immutability The Inverse Life Coach Pattern Trust The foundation of software security 1. Hello! Im Businessman Bob! 2. Hello! Im the


slide-1
SLIDE 1

Secure Coding Patterns

Andreas Hallberg, TrueSec

slide-2
SLIDE 2

Trust Domain-Driven Security The Untrusted Pattern The Inverse Life Coach Pattern Immutability

slide-3
SLIDE 3

Trust

The foundation of software security

slide-4
SLIDE 4
slide-5
SLIDE 5
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!
  • 3. Transfer X euro from account Y to

account Z, please!

  • 4. Ok!
slide-6
SLIDE 6
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!

What might go wrong?

slide-7
SLIDE 7
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!

How can the bank be sure that Bob is Bob? How can Bob be sure that the bank is the bank?

  • 3. Transfer X euro from account Y to

account Z, please!

  • 4. Ok!
slide-8
SLIDE 8
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!

Do we know that Bob owns account Y?

  • 3. Transfer X euro from account Y to

account Z, please!

  • 4. Ok!
slide-9
SLIDE 9
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!

Do we know that account Y holds X euro?

  • 3. Transfer X euro from account Y to

account Z, please!

  • 4. Ok!
slide-10
SLIDE 10
  • 1. Hello! I’m Businessman Bob!
  • 2. Hello! I’m the bank!

Do we even know that X is a number?

  • 3. Transfer X euro from account Y to

account Z, please!

  • 4. Ok!
slide-11
SLIDE 11

Your application

The user 3rd party services Database HTTP/S request data etc...

Trust boundary

slide-12
SLIDE 12

TRUSTED UNTRUSTED

slide-13
SLIDE 13

Validation Untrusted Rejected Trusted

slide-14
SLIDE 14

Validation and friends

  • Validation
  • Making sure data is valid in the domain

Example: I can’t transfer amount “a” or -1

  • Canonicalization and/or normalization
  • Must happen *before* validation!

Example: c:\public\fileupload\..\..\secrets\keys => c:\secrets\key

  • Sanitization
  • Clean up dangerous/unknown data

Example: log injection

slide-15
SLIDE 15

Validation, cont.

  • Always prefer whitelisting over blacklisting
  • It’s easier to figure out what’s valid over what’s not valid
  • Strict validation finds bugs early!
slide-16
SLIDE 16

Ask yourself...

What is the largest acceptable range for this parameter? Don’t accept any more than that!

slide-17
SLIDE 17

Trust

slide-18
SLIDE 18

Domain-Driven Security

Use the type system and your domain objects

slide-19
SLIDE 19
  • 1. Hello! This is Bob again!
  • 2. Hello Bob! I’m still the bank!
  • 3. Transfer -1000 euro from account Y

to account Z, please!

  • 4. Ok!
slide-20
SLIDE 20

The same validation has to be performed over and over

  • Easy to forget to validate somewhere
  • Validation ends up everywhere in the code, but (because of this?) is

easily forgotten

  • Should validate even from “internal” sources such as databases

Example: stored XSS

slide-21
SLIDE 21

Your application

The user 3rd party services Database HTTP/S request data etc...

Trust boundary

String String Integer Integer Validation Validation

slide-22
SLIDE 22

Domain-Driven Security

  • Primitive types and data structures are untrusted by default
  • Strings, integers, byte arrays, collections etc.
  • Domain objects
  • Built-in validation
  • (Immutability – more on this later!)
slide-23
SLIDE 23

Your application

The user 3rd party services Database HTTP/S request data etc...

Trust boundary

String Integer Account Amount

slide-24
SLIDE 24

public final class AccountNumber { private final String value; public AccountNumber(String value) { if(!isValid(value)){ throw new IllegalArgumentException("Invalid account number"); } this.value = value; } public static boolean isValid(String accountNumber){ return accountNumber != null && hasLength(accountNumber, 10, 12) && isNumeric(accountNumber); } }

slide-25
SLIDE 25

Webservice

SOAP (int, string, byte[], ...)

User Account

slide-26
SLIDE 26

SOAP (int, string, byte[], ...)

Exception!

User Account

Webservice

slide-27
SLIDE 27

public void Reticulate(Spline spline, int angle);

WTF ??

public void Reticulate(Spline spline, Angle angle);

slide-28
SLIDE 28

Domain Driven Security essentials

  • The type system ensures that the correct domain object must

be used

  • You know that all domain objects are valid
  • Remember: you still need to validate your business rules! But

at least you don’t have to worry about the building blocks being invalid

  • You know you forgot to validate something when you see

primitive types being passed around

slide-29
SLIDE 29

One more thing...

slide-30
SLIDE 30

Never let null carry information!

  • Value might not exist => Optional<T>
  • “This shouldn’t happen!” => Throw!
slide-31
SLIDE 31

public class Optional<T> { public bool IsPresent(); public T Get(); } int? foo = null;

slide-32
SLIDE 32

Trust Domain-Driven Security Trust

slide-33
SLIDE 33

The Untrusted Pattern

Make trust a first-class concept at trust boundaries

slide-34
SLIDE 34

public void Foo(string bar) { if (!IsValid(bar)) { throw new ValidationException(); } DoSomethingWith(bar); }

slide-35
SLIDE 35

public void Foo(string untrusted_bar) { if (!IsValid(untrusted_bar)) { throw new ValidationException(); } var bar = untrusted_bar; DoSomethingWith(bar); }

slide-36
SLIDE 36

public void Foo2(string untrusted_bar, string untrusted_frob, byte[] data);

WTF ??

slide-37
SLIDE 37

public void Foo(string untrusted_bar) { var bar = Validate(untrusted_bar); DoSomethingWith(bar); }

slide-38
SLIDE 38

public void Foo(Untrusted<string> bar);

slide-39
SLIDE 39

public class Untrusted<T> { readonly T _value; public Untrusted(T value) { _value = value; } private T Value { get { return _value }; } } [assembly: InternalsVisibleTo("Validation")]

slide-40
SLIDE 40

// In the "Validation" assembly public abstract class Validator<T> { public T Validate(Untrusted<T> untrusted) { if (!InnerValidate(untrusted.Value)) { throw new ValidationException(); } return untrusted.Value; } protected abstract bool InnerValidate(T value); }

slide-41
SLIDE 41

public void HandleAcctNbr(Untrusted<string> accountNbr) { var trusted = new AccountNumberValidator().Validate(accountNbr); DoSomethingWith(trusted); }

slide-42
SLIDE 42

public void CreateAccount(string nbr) { var untrustedNbr = new Untrusted<string>(nbr); HandleAccountNbr(untrustedNbr); ... }

slide-43
SLIDE 43

Trust Domain-Driven Security The Untrusted Pattern

slide-44
SLIDE 44

Immutability

Stuff passed over a trust boundary, regardless of direction, should not be able to change later.

slide-45
SLIDE 45

Does your application handle concurrency?

  • Hundreds of threads?
  • How does that affect validation?
  • The thing you just validated, is it still valid?
slide-46
SLIDE 46

TOCTTOU Time Of Check To Time Of Use

slide-47
SLIDE 47

public ic void tryTransfer(Amount amount) { if if (!this.account.contains(amount)) { throw

  • w new

new ValidationException(); } transfer(amount); } TOC TOU

Thread 2: amount.setValue(1000000);

slide-48
SLIDE 48

public ic class ss Amount { priva vate te final al Intege eger value; public ic Amount(Intege ger value) { if (!isValid(value) { throw new IllegalArgumentException(); } this.value = value; } public ic Inte tege ger getValue() { retur urn this.value; } }

slide-49
SLIDE 49

Immutability

  • Immutability significantly reduces TOCTTOU-problems
  • Plays very well with Domain Driven Security
  • … and readability
  • … and parallelization
  • … and event sourcing
  • ... etc
slide-50
SLIDE 50

Race condition, web example

slide-51
SLIDE 51

public void Wizard_Step3(Guid key) { var data = wizardData[key]; if (UserHasAccess(HttpContext.Current.User, data.ProductId)) // TOC { DoSomethingWith(data); // TOU } } { Wizard_Step2(key, secret_productId) } public Guid Wizard_Step1() { var key = Guid.NewGuid(); wizardData.Add(key, new Data()); return key; } public void Wizard_Step2(Guid key, string productId) { wizardData[key].ProductId = productId; } static Dictionary<Guid, Data> wizardData = new Dictionary<Guid, Data>();

slide-52
SLIDE 52

public Guid Wizard_Step1() { var key = Guid.NewGuid(); wizardData.Add(key, new ImmutableData()); return key; } public void Wizard_Step2(Guid key, string productId) { var data = wizardData[key]; var newData = data.CloneWithProductId(productId); // Copies data, new productId wizardData[key] = newData; } public void Wizard_Step3(Guid key) { var data = wizardData[key]; if (UserHasAccess(HttpContext.Current.User, data.ProductId)) // TOC { DoSomethingWith(data); // TOU } } static Dictionary<Guid, ImmutableData> wizardData = new Dictionary<Guid, ImmutableData>();

slide-53
SLIDE 53

Immutability

  • Security spray
  • Should be the norm!
slide-54
SLIDE 54

Trust Domain-Driven Security The Untrusted Pattern Immutability

slide-55
SLIDE 55

The Inverse Life Coach Pattern

Be a pessimist!

slide-56
SLIDE 56

boolean success = true; return success;

slide-57
SLIDE 57

boolean success = false; return success;

Assume failure!

slide-58
SLIDE 58

public ResultData doStuff(Account account) { if (!hasAccess(account)) { throw new Exception(); } return new ResultData(stuffFromCode); }

Fail fast and force a narrow path of success

Fail fast (use Exceptions)! Enforce ”path of success” – no way of exiting without a valid object

slide-59
SLIDE 59
slide-60
SLIDE 60

Consider your Trust Boundaries

slide-61
SLIDE 61

Enjoy Domain-Driven Security

slide-62
SLIDE 62

Immutability should be the norm

slide-63
SLIDE 63

Null is a burning bag of dog poop

slide-64
SLIDE 64

Fire your Life Coach

slide-65
SLIDE 65

@andhallberg andreas.hallberg@truesec.se

slide-66
SLIDE 66
  • Hacking Modern Cars - How to do it and How to Stop it
  • The Jurassic Web Attack
  • Hackers toolkit
  • Security threats and mitigations for iOS developers
  • HTTP/2 is a faster and safer HTTP
  • What's up with XXE?
  • A Live hacking experience!

http://oredev.org/2015/security-day