Πέμπτη 27 Φεβρουαρίου 2014

Client State Manipulation

I. Pizza Delivery Web Site

a. Web App for delivering pizza
 - Online order από order.html – όπου ο χρήστης μπορεί να αγοράσει μία πίτσα για 5.50$
 - Confirmation form: παράγεται από confirm_order script, ο χρήστης πρέπει να πιστοποιήσει την παραγγελία, κι η τιμή παρέχεται από ένα hidden field της φόρμας.
 - Fullfilment: submit_order script το οποίο διαχειρίζεται την order του χρήστη την οποία έλαβε με GET request από την confirmation form.

b. Confirmation Form
<HTML><head><title>Pay for Pizza</title></head>
<body><form action=”submit_order” method=”GET”>
<p>The total cost is 5.50. Are you sure you would like to order?</p>
<input type=”hidden” name=”price” value=”5.50”>
<input type=”submit” name=”pay” value=”yes”>
<input type=”submit” name=”pay” value=”no”>
</form></body></HTML>

c. Submit Order Script
if (pay = yes) {
success = authorize_credit_card_charge(price);
if (success) {
settle_transaction(price);
dispatch_delivery_person();
} else { //Could not authorize card
tell_user_card_declined();
}
} else { display_transaction_cancelled_page(); //no}

<input type=”hidden” name=”price” value=”0.01”>

d. Command line tools to generate HTTP requests
curl or wget automates & speeds up attack
curl http://www.deliver-me-pizza.com/submit_order?price=0.01&pay=yes
Even against POST can specify parameters as arguments to curl or wget command
curl –dprice=0.01 –dpay=yes https://www.delivery-me-pizza.com/submit_order
wget –post-data ‘price=0.01&pay=yes’ https://www.deliver-me-pizza.com/submit_order

e. Authoritative State stays on Server
 - O server στέλενει session-id στον client.
 - O server κρατάει table όπου έχει mapped τα session-ids με τα prices.
 - Γεννήτρια τυχαίων αριθμών για την παραγωγή 128-bit id, όπου θα σταλθεί από την hidden form field αντί της τιμής.

f. Αλλαγές στο submit_order script
if (pay = yes) {
price = lookup(session-id); // in table
if (price != NULL) {
//same as before
}
else { // Cannot find session
display_transaction_cancelled_page();
log_client_IP_and_info(); }
} else {
//same no case
}

g. Session Management
 - 128-bit session-id, n=# of session-ids, limit chance of correct guest to n/2128
 - Management
  • Time-out idle session-ids
  • Clear expired session-ids
  • Session-id: hash random # & IP address – harder to attack, but fragile

 - Server requires DB lookup for each request
  • Performance bottleneck – possible DoS from attackers sending random session-ids
  • Distribute DB, load balance requests

h. Signed State to Client
 - Keep server stateless, attach a signature to state and send to client
  • Can detect tampering through MACs
  • Sign whole transaction 
  • Security based on secret key known only to server

II. Information Leakage

a. GET: form parameters leak in URL, could anchor these links of hidden form fields

b. Referers can leak through outlinks
 - This <a href=http://www.grocery-store-site.com/> link
 - Sends request: GET / HTTP/1.1 Referer: http….
 - Session-id leaked to grocery-store-site’s logs!

c. Benefits of POST
 - Referers can still leak without user interaction
  • Instead of link, image: <a href=http://www.grocery-store-site.com/banner.gif>
  • GET request for banner.gif still leaks session-id

 - POST request: POST /submit_order HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 45 session-id ….
  • Session-id not visible in URL
  • Pasting into e-mail wouldn’t leak it
  • Slightly inconvenient for user, but more secure

III. Cookies

a. Cookie: piece of state maintained by client
 - O server στέλνει cookies στον client
 - O client στέλνει cookies στον server μέσο HTTP requests
 - Ex: session-id in cookie in lieu of hidden form field
HTTP/1.1 200 OK 
SET-Cookie: session-id = … ; secure

 - Secure dictates using SSL
 - Browser replies
GET /submit_order?pay=yes HTTP/1.1
Cookie: session-id= … 

b. Problems with Cookies
 - Cookies are associated with browser, sent back with each request, no hidden field to tack on
 - If user doesn’t log out, attacker can use same browser to impersonate user
 - Session-ids should have limited lifetime

IV. Javascript

a. Popular client-side scripting language

b. Evil user can just delete JavaScript code, substitute desired parameters & submit. Could also just submit request & bypass JavaScript

c. Data validation or computations done by JavaScript cannot be trusted by server
 - Attacker may alter script in HTML code to modify computations
 - Must be redone on server to verify

Buffer Overflows

I. Anatomy of a Buffer Overflow

a. Buffer: μνήμη που χρησιμοποιείται για store user input, με καθορισμένο maximum size

b. Buffer overflow: όταν η user input υπερβαίνει το maximum buffer size. Επιπλέον input οδηγεί σε απροσδόκητη περιοχή μνήμης

void get_input() {
char buf[1024];
gets(buf);
}

void main (int argc, char*argv[]) {
get_input();
}

c. Παράδειγμα Buffer Overflow

int checkPassword() {
char pass[16];
bzero(pass, 16); // Initialize
printf(“Enter password: “);
gets(pass);
if (strcmp(pass, “opensesame”) ==0)
return 1;
else
return 0;
}

void openVault() {
// Opens the vault
}

main() {
if (checkPassword()) {
openVault();
printf(“Vault opened!”);
}
}

d. checkPassword() Bugs

 - Execution stacks: maintains την συγκεκριμένη συνάρτησης και κρατάει την διεύθυνση της return function
 - Stack frame: κρατά μεταβλητές και δεδομένα της συνάρτησης
 - Επιπλέον user input (>16 chars) επικαλύπτει την return address

  • Attack string 17-20th chars μπορούν να προσδιορίσουν την διεύθυνση της OpenVault() και να κάνουν bypass check
  • Η διεύθυνση μπορεί να βρεθεί από τον πηγαίο κώδικα ή το binary αρχείο

e. Non-Executable Stacks δεν επιλύουν τα προβλήματα

 - Ενδεχόμενη επίθεση μπορεί να κάνει overwrite τη return address και να δώσει νέο point με injected code
 - NX stacks μπορούν να το αποτρέψουν αυτό, αλλά όχι στο παρών παράδειγμα (jumping to an existing function)
 - Return-into-libc- attack: jump to library functions

f. The safe_gets() Function

#define EOLN ‘\n’
void safe_gets (char *input, int max_chars) {
if ((input == NULL) || (max_chars < 1))) return;
if (max_chars == 1) { input[0] = 0; return;}
int count = 0;
char next_char;
do {
next_char = getchar(); // one character at a time
if (next_char != EOLN)
input[count++] = next_char;
} while ((count < max_chars-1) && // leave space for null
(next_char != EOLN));
Input[count] = 0;
 - Σε αντίθεση με τη gets(), λαμβάνει την παράμετρο καθορίζοντας τους max chars που θα εισάγει στον buffer
 - Χρησιμοποιεί την checkPassword αντί της gets() για να αποτρέψει κάθε buffer overflow ενδεχόμενο

II. Safe String Libraries

a. C – Avoid (no bounds check) : strcpy(), strcat(), sprint(), scanf()

b. Use safer versions (with bounds check): strncpy(), strncat(), fgets()

c. Null Terminations: StrSafe(), SafeStr()

d. C++: STL string class handles allocation

e. Unlike compiled language (C/C++), interpreted ones (Java/C#) enforce type safety, raise exceptions for buffer overflow

III. Additional Approaches

a. StackGuard/Canaries

 - Canary: random value, μη προβλέψιμη από τον hacker
 - Compiler technique: ενσωματώνει την Canary τιμή πριν την return address στην stack
 - Corrupt Canary: ο κώδικας τερματίζει προκειμένου να αποφύγει ενδεχόμενη επίθεση

b. Static Analysis Tools

 - Static Analysis: ανάλυση του προγράμματος χωρίς να τρέχει το πρόγραμμα
 - Meta-level compilation

  • Αναζήτηση για security, synchronization και memory bugs
  • Εντοπισμός συχνών code patterns/idioms και σηματοδότηση ενδεχόμενων code anomalies

 - Coverity

 - Fortify

 - Ounce Labs

 - Klockwork


IV. Heap-Based Overflows

a. H malloc() στην C, δεσμεύει ένα κομμάτι μνήμης στην heap

b. Εώς ότου εκτελεστεί η realloc(), ενδεχόμενη επίθεση μπορεί να προκαλέσει overflow στον heap buffer, να επικαλύψει δεδομεένα και να αλοιώσει το control path του προγράμματος

c. Παρόμοιες μέθοδοι αντιμετώπισης: bounds checking on input

V. Other Memory Corruption Vulnerabilities

a. Format String Vulnerabilities
 - Format String στη C δείχνει πως πρέπει να είναι formatted το κείμενο στην έξοδο (π.χ. %d, %s)
 - Integer Overflows
 - Υπέρβαση των ορίων ενός integer
Signed 4-byte int: (-232) – (232 - 1)
/*Writes str to buffer with offset characters of blank spaces preceding str. */
void formatStr (char *buffer, int buflen, int offset, char *str, int slen) {
char message[slen+offset];
int I;
/* Write blank spaces */
for (i = 0; I < offset; i++)
message[i] = ‘ ‘;
strncpy(message+offset, str, slen);
// offset = 232!?
strncpy(buffer, message, buflen);
message[buflen-1] = 0;
/*Null terminate */

Δευτέρα 24 Φεβρουαρίου 2014

Worms and Other Malware

a. Virus είναι ένα πρόγραμμα το οποίο αντιγράφει τον εαυτό του σε άλλα προγράμματα

b. Worm είναι ένας ιός ο οποίος χρησιμοποιεί το network για να αντιγράψει τον εαυτό του σε άλλους υπολογιστές. Τα Worms πολλαπλασιάζονται γρηγορότερα από τους Viruses

c. Ιστορία των Worms
- First Worm: Morris Worm (1988)

  • Μόλυνε 6000 υπολογιστές σε λίγες ώρες.
  • Απλά έκανε copy τον εαυτό του, δεν πείραξε data
  • Προκάλεσε buffer overflow σε fingerd (UNIX)
  • Εκτελούσε sendmail σε debug mode
  • Με dictionary 432 συνήθεις κωδικούς προσπαθούσε να κάνει login και να εκτελέσει remotely εντολές μέσω rexec και rsh
  • Lessons Learned: diversity is good, Large programs more vulnerable to attack, limiting feature limits holes, users should choose good passwords

 - Code Red & Nimda (2001)


  • Προκάλεσε buffer overflow σε Microsoft IIS web servers
  • Μόλυνε πάνω από 2000 hosts/min
  • Απέφευγε τον αυτόματο εντοπισμό
  • Προκαλούσε deface στην κεντρική σελίδα του μολυσμένου server

 - SQL Slammer (2003)


  • Προκαλούσε buffer overflow κάνοντας χρήση 376-byte UDP πακέτων
  • Μόλυνε 75.000 hosts μέσα σε 10 minutes
  • Επιτέθηκε σε Microsft SQL Server Database Applications
  • Απενεργοποιούσε το server, σάρωνε διευθύνσεις για επόμενη επίθεση

d. Malware Τύποι
 - Rootkits: imposter OS tools used by attacket to hide tracks

 - Botnets: network of software robots attacker uses to control many machines at once to launch attacks

 - Spyware: software that monitors activity of a system or its users without their consent

 - Keyloggers: spywares that monitors user keyboard or mouse input, used to steal usernames, passwords, credit card, e.t.c

 - Trojan Horses: software performs additional or different functions than advertised

 - Clickbots: bot that clicks on ads, leads to click fraud

e. Clickbot.A Botnet
 - Πάνω από 100.000 υπολογιστές, HTTP based botmaster
 - Διηύθυνε low-noise click fraud σε syndicated search engines
 - Μόνο 7/24 anti-virus scanners τον ανίχνευσαν στις 05/2006
 - Ο Internet Explorer βοήθησε με την ύπαρξη του αντικειμένου BHO
 - Έκανε χρήση των doorway sites
 - Fine grained control για τον botmaster

f. Fake Anti-Virus Trojan Horse

g. DroidDream: Mobile Trojan Horse

h. Distributing Malware

 - Η πιο συνηθισμένη διακίνηση Malware γίνεται με drive-by downloads
 - Search engines όπως η Google μαρκάρει σελίδες με πιθανή ύπαρξη Malware

i. Zeus Botnet

 - Spread via drive-by-downloads
 - July 2007
 - Compromised over 74.000 FTP accounts in June 2009
 - Affected: Bank of America, NASA, Monster, ABC, Oracle, Cisco, Amazon and BusinessWeek

j. Πως λειτουργεί η drive-by-download επίθεση
 - Inject legitimate web page with malicious code
 - Invoke client side vulnerability or use social engineering
 - Deliver shellcode to take control
 - Send “downloader” & deliver malware of attackers choice

k. Drive-by-download infections vectors

 - Inject Javascript
 - Invoke client-side vulnerabilities
 - Deliver Shellcode via JavaScript Heap Spray
 - Send “Downloader” and Join Botnet

Secure Design Principles

I. Principle of Least Privilige

a. SimpleWebServer Παράδειγμα
 - Αν ο server τρέχει στο root account, οι clients θα μπορούν να έχουν πρόσβαση σε όλα τα αρχεία του συστήματος.
 - serveFile() method δημιουργεί το FileReader αντικείμενο για arbitrary pathname από τον user

  • GET ../../../../etc/shadow HTTP/1.0
  • η προσπέλαση στο UNIX, μέχρι το root θα περιλαμβάνει λίστα από usernames & encrypted passwords
  • o hacker μπορεί χρησιμοποιήσει αυτές τις πληροφορίες για να εκτελέσει dictionary attack
  • απαιτείται να γίνει canonicalize και validate του pathname

 - Least Privilige: να μην τρέχει ο server στο root

b. Canonicalizing Pathnames
 - checkPath() method εξασφαλίζει ότι το target path είναι κάτω από το current path κι όχι απλά στο pathname
String checkPath(String pathname) throws Exception {
File target = new File(pathname)
File cwd = new File(System.getProperty(“user.dir”));
/*User’s current working directory stored in cwd */
String targetStr = target.getCanonicalPath();
String cdwStr = cwd.getCanonicalPath();
If (!targetStr.startsWidth(cwdStr)
Throw new Exception(“File not Found”);
else return targetStr;
}
fr = new FileReader (checkPath(pathname));

II. Defense-in-Depth

a. Redundancy

b. Diversity

c. Layers of defense

d. Prevent, Detect, Contain and Recover

 - Πρέπει να υπάρχουν μηχανισμοί για αποτροπή επιθέσεων, ανίχνευση παραβάσεων, επιθέσεις σε εξέλιξη και επαναφορά του συστήματος
 - Η ανίχνευση είναι ιδιαίτερα σημαντική, αφού η ασφάλεια δικτύου δεν είναι απόλυτα functional κατά τη διάρκεια μίας επίθεσης

e. Password Security Παράδειγμα

 - Ο Sys Admin προτείνει στους χρήστες να γίνει χρήση περίπλοκων passwords
 - H ανίχνευση μπορεί να γίνει από τα server logs όπου είναι ορατά πολλπλά failed logins από συγκεκριμένη IP
 - Αποτροπή login από ύποπτη IP ή επιπλέον checks (όπως cookies)
 - Επαναφορά λογαριασμών όπου έχουν δεχθεί επίθεση, παύση ύποπτων transactions

III. Securing the Weakest Link

a. Unsecured Dial-In Hosts: War Dialers (historical)

b. Weak Passwords: easy to crack

 - Το ένα τρίτο των χρηστών χρησιμοποιεί κωδικούς που μπορούν να βρεθούν σε ένα λεξικό
 - Ο hacker με μία dictionary attack μπορεί να βρει με επιτυχία τον κωδικό
 - Με την χρήση του Least Privilige μπορεί να γίνει μετρίαση της ζημιάς σε εκτιθεμένους λογαριασμούς

c. People Social Engineering Attacks

 - Πολλοί χρήστες μπορούν να γίνουν θύματα κάποια phishing attack
 - Ύπαρξη backdoors σε προγράμματα (απαραίτητο το code review)
 - Ικανοποιημένοι χρήστες, δεν έχουν κίνητρα να εξαπατήσουν τον οργανισμό στον οποίο ανήκουν.

d. Buffer Overflows from garbage Input

e. Implementation Vulnerabilities

 - Ένα σωστό design μπορεί να έχει bugs στην υλοποίηση
 - Λανθασμένη χρήση της κρυπτογράφησης μπορεί να οδηγήσει ένα hacker στο να την παρακάμψει και να έχει πρόσβαση στα προστατευμένα δεδομένα
 - Ακούσια μίξη ελέγχου και data

IV. Fail-Safe Stance

a. Πρόληψη και σχεδιασμός για ένα System Failure

b. SWS Fail-Safe Παράδειγμα

Public void serveFile (Output StreamWriter osw, String pathname) throws Exception {
Filereader fr = null;
Int c = -1;
StringBuffer sb = new StringBuffer();
/* … code excluded …*/
while (c != -1) {
sb.append ((char)c); // if memory run out, crashes!
c = fr.read();
}
osw.write (sb.toString());

c. Έλεγχος του File Length
 - Serve file μόνο όταν υπάρχει απαιτούμενη διαθέσιμη μνήμη
pathname = checkPath(pathname); //canonicalize
File f = new File(pathname);
/* …*/
If (f.length() > Runtime.getRuntime().freeMemory()) {
throw new Exception();
}

d. Secure By Default

e. Simplicity

f. Usability for Security

 - Whitten-Tygar definition: Security Software είναι χρηστική όταν οι χρήστες που θα κάνουν χρήση αυτής:

  • Έχουν γνώση των security tasks τα οποία πρέπει να πραγματοποιήσουν
  • Είναι ικανοί να ορίσουν πότε τα task εκτελέστηκαν με επιτυχία
  • Δεν κάνουν σοβαρά λάθη
  • Είναι ιδιαίτερα άνετοι με το περιβάλλον χρήσης

Κυριακή 23 Φεβρουαρίου 2014

Secure Systems Design - Part II

IV. Simple Web Server

Για να γίνει κατανοητό τι μπορεί να πάει στραβά σε μία λάθος σχεδίαση, όσον αφορά την ασφάλεια, παραθέτω το παρακάτω παράδειγμα ενός web server, ο οποίος υλοποιήθηκε σε Java.

a. Hypertext Transfer Protocol
HTTP είναι το πρωτόκολλο επικοινωνίας το οποίο χρησιμοποιούν οι servers στο Web. Μία ιστοσελίδα ξεκινάει ως http://prefix
Ένα τυπικό HTTP request, από έναν browser σε ένα web server είναι:
GET / HTTP/1.0
Η απόκριση από το server θα είναι η αναζήτηση του root αρχείου (index.html) κι επιστροφή HTTP/1.0 200 OK μαζί με τα περιεχόμενα του αρχείου.

/*This method is called when the program is run from the command line. */
public static void main (String argv[]) throws Exception
{
/*Create a SimpleWebServer object, and run it */
SimpleWebServer sws = new SimpleWebServer();
sws.run();
}

public class SimpleWebServer {
/*Run the HTTP server on this TCP port. */
private static final int PORT = 8080;
/*The socket used to process incoming connections from web clients*/
private static ServerSocket dServerSocket;

public SimpleWebServer () throws Exception {
dServerSocket = new ServerSocket (PORT);
}

public void run () throws Exception {
while (true) {
/*wait for a connection from a client */
Socket s = dServerSocket.accept ();
/* then process the client’s request */
processRequest(s);
                }
}

/*Reads the HTTP request from the client, and responds with the file the user requested or a HTTP error code */
public void processRequest (Socket s) throws Exception {
/*used to read data from the client */
BufferedReader br = new BufferedReader (new InputStreamReader (s.getInputStream()));
/*used to write data to the client */
OutputStreamWriter osw = new OutputStreamWriter (s.getOutputStream());
/* read the HTTP request from the client */
String request = br.readLine();
String command = null;
String pathname = null;
/* parse the HTTP request */
StringTokenizer st = new StringTokenizer (request, “ “);
Command = st.nextToken();
Pathname = st.nextToken();
if (command.equals(“GET”)) {
/*if the request is a GET try to respond with the file the user is requesting */
serveFile (osw, pathname);
}
else {
/*if the request is a NOT a GET, return an error saying this server does not implement the requested command */
osw.write (“HTTP/1.0 501 Not Implemented\n\n”);
}
/* close the connection to the client */
osw.close();
}

public void serveFile (OutputStreamWriter osw, String pathname) throws Exception {
FileReader fr = null;
Int c = -1;
StringBuffer sb = new StringBuffer();
/*remove the initial slash at the beginning of the pathname in the request */
If (pathname.charAt(0) == ‘/’)
pathname = pathname.substring(1);
/* if there was no filename specified by the client, serve the “index.html” file */
If (pathname.equals(“”))
pathname = “index.html”;
/* try to open file specified by pathname */
try {
fr = new FileReader(pathname);
c = fr.read();
}
catch (Exception e) {
/* if the file is not found, return the appropriate HTTP response code */
osw.write (“HTTP/1.0 404 Not Found \n\n”);
return;
}
/* if the requested file can be successfully opened and read, then return an OK response code and send the contents of the file */
osw.write (“HTTP/1.0 200 OK\n\n”);
while (c != -1) {
sb.append ((char)c);
c = fr.read();
}
osw.write (sb.toString());
}

b. DoS Παράδειγμα
processRequest(){
/*read the HTTP request from the client*/
String request = br.readline(); //empty string
String command = null;
String pathname = null;
/*parse the HTTP request*/
StringTokenizer st = new StringTokenizer(request, " ");
command = st.nextToken(); // EXCEPTION: no tokens!
/*SERVER CRASHES HERE - DENIAL OF SERVICE! */
pathname = st.nextToken();
}

c. How do we fix this?
 - Ο web server πρέπει να αποσυνδεθεί από τον web client ο οποίος στέλνει την malformed HTTP request στο server.
 - Ο προγραμματιστής πρέπει να χειριστεί με προσοχή τα exceptions για τις malformed requests.
 - Λύση: περικύκλωση του String Tokenizing κώδικα με try/catch block.
/*read the HTTP request from the client */
String request = br.readline();
String command = null;
String pathname = null;

try {
/*parse the HTTP request */
StringTokenizer st = new StringTokenizer(request, " ");
command = st.nextTokenizer();
pathname = st.nextTokenizer();
}
catch (Exception e) {
osw.write("HTTP/1.0 400 Bad Request\n\n");
osw.close();
return;
}

Secure Systems Design - Part I

I. Understanding Threats

a. Defacement

 - Online Vandalism, επιθέσεις με σκοπό να αντικαταστήσουν νόμιμες ιστοσελίδες με παράτυπο περιεχόμενο.

 - Συνήθεις στόχοι, ιστοσελίδες πολιτικού περιεχομένου.

b. Infiltration
 - Μη πιστοποιημένα άτομα, λαμβάνουν πρόσβαση σε πόρους υπολογιστικών συστημάτων (CPU, Disk Drives, Network Bandwidth).
 - Πρόσβαση σε read/write access το back-end βάση δεδομένων.
 - Οι επιθέσεις πρέπει να εντοπίζονται.
 - Διαφορετικές προϋποθέσεις σε θέματα ασφάλειας, ανάλογα με τον οργανισμό.

c. Phishing

 - Δημιουργία spoofed ιστοσελίδων που ομοιάζουν με πραγματικές

<a href=http://www.evil-site.com>
Legitimate Site
</a>

d. Pharming

 - Προτροπή στον χρήστη να εισάγει ευαίσθητα δεδομένα σε μία spoofed ιστοσελίδα.
 - DNS Cache Poisoning, o hacker κατορθώνει να δρομολογήσει ένα legitimate URL σε μία spoofed ιστοσελίδα.
 - O DNS μεταφράζει ένα URL σε μία, προσδιοριζόμενη από τον hacker, IP.

e. Insider Threats

 - Επιθέσεις με τη συνεργασία εκ των έσω.
 - Διαφοροποίηση των Privileges ανάμεσα στους χρήστες, μη εξουσιοδότηση πρόσβασης σε δεδομένα και πόρους αν δεν συντρέχει λόγος.

f. Click Fraud

 - Pay per click διαφημίσεις.
 - Ο hacker κλικάρει διαφημίσεις αντιπάλου, ώστε να εξαντλήσει το ad budget τους.
 - Αυτόματο κλικ με botnets.

g. Denial of Service (DoS)

 - O hacker κατακλύζει το server με traffic, ώστε να αναγκάσει το server να απορρίψει legitimate packets.
 - Συνήθεις στόχοι, οικονομικοί και e-commerce vendors.
 - Μπορεί να αυτοματοποιηθεί μέσω botnets.

h. Data Theft and Data Loss

 - BofA: απώλεια backup data tapes κατά τη μεταφορά.
 - Fraudsters εκτελούν queries σε βάση δεδομένων με ευαίσθητα δεδομένα.
 - Χρήστης με προσωπικές πληροφορίες στον υπολογιστή του, πέφτει θύμα διάρρηξης.


II. Threat Modeling

STRIDE:

  • Spoofing Identity
  • Tampering (unauthorized modification)
  • Repudiation
  • Information Disclosure (unauthorized read)
  • Denial of Service
  • Escalation of privilege

III. Designing in Security

a. Σχεδίαση των features λαμβάνοντας υπόψιν την ασφάλεια
 - Όχι σαν afterthought.
 - Δύσκολα η ασφάλεια μπορεί να ενσωματωθεί αργότερα σαν add – on.

b. Σχεδίαση concrete, measurable security goals.
 - Πόσοι χρήστες θα μπορούν να εκτελέσουν την ενέργεια Χ.
 - Ποιο output του feature Y, θα πρέπει να είναι encrypted.
 - To feature Z θα πρέπει να είναι διαθέσιμο 99.9% του χρόνου.

c. Παράδειγμα κακής σχεδίασης: Windows 98
 - Diagnostic mode, πατώντας το πλήκτρο F8 κατά την εκκίνηση.
 - Ήταν δυνατή η προσπέλαση του κωδικού προστασίας, δίνοντας πλήρη πρόσβαση στο σκληρό δίσκο και στα δεδομένα.
 - Η ασφάλεια Username/Password προστέθηκε αργότερα.
 - Θα έπρεπε να είχε ενσωματωθεί από την αρχή, ώστε να απαιτείτε για την είσοδο σε Diagnostic Mode.

d. Παράδειγμα κακής σχεδίασης: Internet
 - Όλοι οι κόμβοι αρχικά, ανήκαν σε πανεπιστήμια ή στρατιωτικές βάσεις.
 - Κατά το commercialization, πολλοί νέοι hosts μπορούσαν να συνδεθούν με τους υπάρχοντες hosts, ανεξάρτητα να ήταν άξιοι εμπιστοσύνης.
 - Ανάγκη για Firewalls.
 - Loopholes, χρήση ελεύθερων ports.

e. IP Whitelisting & Spoofing

 - IP Whitelisting: αποδοχή επικοινωνίας μόνο από hosts συγκεκριμένων IP.
 - IP Spoofing: mislabeling την source address, ώστε το πακετο να διαπεράσει το Firewall.

f. IP Spoofing & Nonces

 - Nonce: one – time ψευδοτυχαίος αριθμός.
 - Η επισύναψη ενός Nonce, για απάντηση και request να επιστραφεί πίσω, είναι προστασία έναντι στο IP Spoofing.
 - O hacker δεν γνωρίζει τι να αλλοιώσει στην απάντηση.
 - Spoofing είναι ευκολότερο σε non-connection-oriented πρωτόκολλα, όπως UDP.
 - TCP sequence #s πρέπει να είναι τυχαία, αλλιώς ο hacker μπορεί να προβλέψει που θα κάνει τα δικά του πακέτα inject, κατά την επικοινωνία.

g. Turtle Shell Architectures
 - Ένα inherently μη ασφαλές σύστημα, προστατεύεται από ένα άλλο σύστημα, όπως Firewall.
 - Ένα εξωτερικό shell δεν είναι επαρκής ασφάλεια.

h. Convenience και Security
 - Κάποιες φορές, αντιστρόφως ανάλογα μεγέθη.

i. Security in Software Requirements
 - Robust consistent error handling.
 - Share requests with QA team.
 - Handle internal errors securely.
 - Use defensive programming.
 - Validation and Fraud Checks
 - “Security or Bust” Policy