Modern Strategies for Legacy Code Security

Malware defenses (cont)
Dealing with legacy code
 
Last time
String vulnerabilities, mainly in C
As opposed to simple buffer overflows
Heap expliots
Some defenses
NX bit (to prevent execution)
Randomizing layouts
Canaries
Note: these generally require re-compilation
What if can’t recompile:  Libsafe
Another Solution:  Libsafe
(Avaya Labs)
Dynamically loaded library
(no need to recompile app.)
Intercepts calls to  strcpy
(dest, src)
Validates sufficient space in
current stack frame:
 
|frame-pointer – dest| >
strlen(src)
If so, does strcpy.   Otherwise,
terminates application
 
How robust is Libsafe?
strcpy() can overwrite a pointer between buf and sfp.
dest
ret-addr
sfp
high
memory
src
buf
ret-addr
sfp
Libsafe strcpy
main
low
memory
More methods
 StackShield
At function prologue, copy return address RET and SFP
to “safe” location  (beginning of data segment)
Upon return, check that RET and SFP is equal to copy.
Implemented as assembler file processor (GCC)
In contrast to Stackguard:
StackShield is (at least allegedly) not as good at
detecting when things other than return address are
altered
Note that both can be vulnerable: see
http://phrack.org/issues/56/5.html#article
More methods:
CFI (control flow integrity)
A combination of static and dynamic checking
Statically determine program control flow
Dynamically enforce control flow integrity
Enforces software execution that follows along a
Control-Flow Graph, which is determined ahead
of time (the static part)
Flow of execution is tracked (the dynamic part),
and program is killed if it deviates
Fairly successful for both stack and heap attacks
where flow of execution is rerouted, but of
course won’t defend against everything
Dealing with legacy code
Often, no choice but to deal with unsafe,
legacy code
Honeypots
Programs from the internet (extensions, plugins,
etc.)
Exposed applications
Most common approach is isolation
Or sandboxing
Approach:   confinement
 
Confinement
:
   ensure misbehaving app cannot harm rest of system
Can be implemented at many levels:
1. Hardware
:   run application on isolated hw  (air gap)
 
 
 
 
   
  difficult to manage
air gap
network 1
Network 2
app 1
app 2
Approach:   confinement
Confinement
:
   ensure misbehaving app cannot harm rest of system
Can be implemented at many levels:
2. Virtual machines
:   isolate an entire OS
Virtual Machine Monitor  (VMM)
OS
1
OS
2
app1
app2
Approach:   confinement
Confinement
:
   ensure misbehaving app cannot harm rest of system
Can be implemented at many levels:
3. Process:     
System Call Interposition
 
      Isolate a process in a single operating system
Operating System
process 2
process 1
Approach:   confinement
Confinement
:
   ensure misbehaving app cannot harm rest of system
Can be implemented at many levels:
4. Threads:
      Software Fault Isolation (SFI)
Isolating threads sharing same address space
5. Application
:  e.g.   browser-based confinement
Implementing confinement
Key component:    
reference monitor
Mediates requests
 from applications
Implements protection policy
Enforces isolation and confinement
Must 
always
 be invoked:
Every application request must be mediated
Tamperproof
:
Reference monitor cannot be killed
… or if killed, then monitored process is killed too
Small
 enough to be analyzed and validated
A old example:    chroot
 
Often used for 
guest
 accounts on ftp sites
 
To use do:   (must be root)
 
chroot   /tmp/guest
 
    root dir 
/
 is now
/tmp/guest
 
su guest
  
    EUID set to 
guest
 
Now  
/tmp/guest
  is added to file system accesses for applications
in jail
  
open(
/etc/passwd
,   
r
)    
  
    
open(
/tmp/guest/etc/passwd
,   
r
)
  application cannot access files outside of jail
Jailkit
Problem:   all utility progs (ls, ps, vi) must live inside jail
jailkit
 project:    auto builds files, libs, and dirs needed in jail
env
jk_init
:    creates jail environment
jk_check:
   checks jail env for security problems
checks for any modified programs,
checks for world writable directories, etc.
jk_lsh
:   restricted shell to be used inside jail
note:  
simple chroot jail does not limit network access
Escaping from jails
 
Early escapes:    relative paths
 
    
open( 
../../etc/passwd
,   
r
)   
 
     
open(
/tmp/guest/../../etc/passwd
,   
r
)
 
chroot 
 should only be executable by root.
otherwise jailed app can do:
create dummy file   
/aaa/etc/passwd
run    
chroot   
/aaa
run    
su  root    
to become root
(bug in Ultrix 4.0)
Many ways to escape jail as root
Create device that lets you access raw disk
Send signals to non chrooted process
Reboot system
Bind to privileged ports
Freebsd jail
Stronger mechanism than simple chroot
To run
:      
jail   jail-path   hostname  IP-addr   cmd
calls hardened chroot (no  
../../
  escape)
can only bind to sockets with specified IP address
and authorized ports
can only communicate with processes inside jail
root is limited, e.g. cannot load kernel modules
Not all programs can run in a jail
Programs that can run in jail:
audio player
web server
Programs that cannot:
web browser
mail client
Problems with chroot and jail
Coarse policies
:
All or nothing access to parts of file system
Inappropriate for apps like a web browser
Needs read access to files outside jail
 
(e.g. for sending attachments in Gmail)
Does not prevent malicious apps from:
Accessing network and messing with other
machines
Trying to crash host OS
System call interposition
 
Observation:   to damage host system (e.g. persistent changes)
app must make system calls:
To delete/overwrite files:
 
unlink, open, write
To do network 
attacks:
 
socket
, bind, connect, send
Idea:    
monitor app’s system calls and block unauthorized calls
Implementation options:
Completely kernel space (e.g. 
GSWTK
)
Completely user space (e.g.  program shepherding)
Hybrid  (e.g.  Systrace)
Initial implementation  
(Janus)
[GWTB’96]
 
Linux 
ptrace
:    process tracing
 
process calls:     
ptrace (… ,  pid_t  pid ,  …)
 
and wakes up when  
pid
  makes sys call.
 
 
 
 
 
Monitor kills application if request is disallowed
OS Kernel
monitored
application
(browser)
monitor
user space
Complications
 
If app forks, monitor must also fork
forked monitor monitors forked app
If monitor crashes, app must be killed
Monitor must maintain all OS state associated with app
current-working-dir (
CWD
),    
UID,   EUID,   GID
When app does 
cd path
 monitor must update its CWD
otherwise:   relative path requests interpreted incorrectly
cd(“/tmp”)
open(“passwd”,  “r”)
cd(“/etc”)
open(“passwd”,  “r”)
Alternate design:  systrace    
[P’02]
 
systrace only forwards monitored sys-calls to monitor  
(efficiency)
systrace resolves sym-links and replaces sys-call
path arguments by full path to target
When app calls  
execve
,  monitor loads new policy file
OS Kernel
monitored
application
(browser)
monitor
user space
open(
etc/passwd
,  
r
)
sys-call
gateway
systrace
policy file
for app
Policies
Policies need to be set for the app, eg:
path allow /tmp/*
path deny /etc/passwd
network deny all
Manually specifying this policy is really difficult:
Systrace can auto-generate policies by learning how
an app behaves on “good” inputs
But if policy doesn’t cover specific behavior, not clear
how to manage
Difficulty with choosing a policy for a given app is the
reason it isn’t more broadly used
Recap: built-in defenses
Note that all of these have been focused on
automatic tools to add security
Either because of legacy code or to provide extra
safeguards from unexpected inputs
However, significant research has also focused on
testing and discovering vulnerabilities by hand
This leads towards injection attacks of various kinds:
unknown input is usually the problem!
We’ll talk more about bug testing and injection
attacks next week, leading towards browser
injections
Slide Note
Embed
Share

Explore advanced defenses against malware in legacy code, including techniques like NX bit implementation, randomizing layouts, and canaries. Learn about tools like Libsafe for dynamically intercepting risky function calls and enhancing security. Discover the effectiveness of methods like StackShield and CFI for controlling program flow and defending against stack and heap attacks in legacy systems.

  • Legacy Code Security
  • Malware Defenses
  • Advanced Techniques
  • Program Flow Control
  • Security Tools

Uploaded on Oct 05, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.

E N D

Presentation Transcript


  1. Malware defenses (cont) Dealing with legacy code

  2. Last time String vulnerabilities, mainly in C As opposed to simple buffer overflows Heap expliots Some defenses NX bit (to prevent execution) Randomizing layouts Canaries Note: these generally require re-compilation

  3. What if cant recompile: Libsafe Another Solution: Libsafe (Avaya Labs) Dynamically loaded library (no need to recompile app.) Intercepts calls to strcpy (dest, src) Validates sufficient space in current stack frame: |frame-pointer dest| > strlen(src) If so, does strcpy. Otherwise, terminates application

  4. How robust is Libsafe? high memory low src buf sfp ret-addr sfp ret-addr dest memory main Libsafe strcpy strcpy() can overwrite a pointer between buf and sfp.

  5. More methods StackShield At function prologue, copy return address RET and SFP to safe location (beginning of data segment) Upon return, check that RET and SFP is equal to copy. Implemented as assembler file processor (GCC) In contrast to Stackguard: StackShield is (at least allegedly) not as good at detecting when things other than return address are altered Note that both can be vulnerable: see http://phrack.org/issues/56/5.html#article

  6. More methods: CFI (control flow integrity) A combination of static and dynamic checking Statically determine program control flow Dynamically enforce control flow integrity Enforces software execution that follows along a Control-Flow Graph, which is determined ahead of time (the static part) Flow of execution is tracked (the dynamic part), and program is killed if it deviates Fairly successful for both stack and heap attacks where flow of execution is rerouted, but of course won t defend against everything

  7. Dealing with legacy code Often, no choice but to deal with unsafe, legacy code Honeypots Programs from the internet (extensions, plugins, etc.) Exposed applications Most common approach is isolation Or sandboxing

  8. Approach: confinement Confinement: ensure misbehaving app cannot harm rest of system Can be implemented at many levels: 1. Hardware: run application on isolated hw (air gap) app 1 app 2 difficult to manage air gap network 1 Network 2

  9. Approach: confinement Confinement: ensure misbehaving app cannot harm rest of system Can be implemented at many levels: 2. Virtual machines: isolate an entire OS app1 app2 OS1 OS2 Virtual Machine Monitor (VMM)

  10. Approach: confinement Confinement: ensure misbehaving app cannot harm rest of system Can be implemented at many levels: 3. Process: System Call Interposition Isolate a process in a single operating system process 1 process 2 Operating System

  11. Approach: confinement Confinement: ensure misbehaving app cannot harm rest of system Can be implemented at many levels: 4. Threads: Software Fault Isolation (SFI) Isolating threads sharing same address space 5. Application: e.g. browser-based confinement

  12. Implementing confinement Key component: reference monitor Mediates requests from applications Implements protection policy Enforces isolation and confinement Must always be invoked: Every application request must be mediated Tamperproof: Reference monitor cannot be killed or if killed, then monitored process is killed too Small enough to be analyzed and validated

  13. A old example: chroot Often used for guest accounts on ftp sites To use do: (must be root) chroot /tmp/guest root dir / is now /tmp/guest su guest EUID set to guest Now /tmp/guest is added to file system accesses for applications in jail open( /tmp/guest/etc/passwd , r ) application cannot access files outside of jail open( /etc/passwd , r )

  14. Jailkit Problem: all utility progs (ls, ps, vi) must live inside jail jailkit project: auto builds files, libs, and dirs needed in jail env jk_init: creates jail environment jk_check: checks jail env for security problems checks for any modified programs, checks for world writable directories, etc. jk_lsh: restricted shell to be used inside jail note: simple chroot jail does not limit network access

  15. Escaping from jails Early escapes: relative paths open( ../../etc/passwd , r ) open( /tmp/guest/../../etc/passwd , r ) chroot should only be executable by root. otherwise jailed app can do: create dummy file /aaa/etc/passwd run chroot /aaa run su root to become root (bug in Ultrix 4.0)

  16. Many ways to escape jail as root Create device that lets you access raw disk Send signals to non chrooted process Reboot system Bind to privileged ports

  17. Freebsd jail Stronger mechanism than simple chroot To run: jail jail-path hostname IP-addr cmd calls hardened chroot (no ../../ escape) can only bind to sockets with specified IP address and authorized ports can only communicate with processes inside jail root is limited, e.g. cannot load kernel modules

  18. Not all programs can run in a jail Programs that can run in jail: audio player web server Programs that cannot: web browser mail client

  19. Problems with chroot and jail Coarse policies: All or nothing access to parts of file system Inappropriate for apps like a web browser Needs read access to files outside jail (e.g. for sending attachments in Gmail) Does not prevent malicious apps from: Accessing network and messing with other machines Trying to crash host OS

  20. System call interposition Observation: to damage host system (e.g. persistent changes) app must make system calls: To delete/overwrite files: unlink, open, write To do network attacks: socket, bind, connect, send Idea: monitor app s system calls and block unauthorized calls Implementation options: Completely kernel space (e.g. GSWTK) Completely user space (e.g. program shepherding) Hybrid (e.g. Systrace)

  21. Initial implementation (Janus) [GWTB 96] Linux ptrace: process tracing process calls: ptrace ( , pid_t pid , ) and wakes up when pid makes sys call. user space monitored application (browser) monitor open( /etc/passwd , r ) Monitor kills application if request is disallowed OS Kernel

  22. Complications cd( /tmp ) open( passwd , r ) If app forks, monitor must also fork forked monitor monitors forked app cd( /etc ) open( passwd , r ) If monitor crashes, app must be killed Monitor must maintain all OS state associated with app current-working-dir (CWD), UID, EUID, GID When app does cd path monitor must update its CWD otherwise: relative path requests interpreted incorrectly

  23. Alternate design: systrace [P02] user space monitored application (browser) policy file for app monitor open( etc/passwd , r ) sys-call gateway systrace permit/deny OS Kernel systrace only forwards monitored sys-calls to monitor (efficiency) systrace resolves sym-links and replaces sys-call path arguments by full path to target When app calls execve, monitor loads new policy file

  24. Policies Policies need to be set for the app, eg: path allow /tmp/* path deny /etc/passwd network deny all Manually specifying this policy is really difficult: Systrace can auto-generate policies by learning how an app behaves on good inputs But if policy doesn t cover specific behavior, not clear how to manage Difficulty with choosing a policy for a given app is the reason it isn t more broadly used

  25. Recap: built-in defenses Note that all of these have been focused on automatic tools to add security Either because of legacy code or to provide extra safeguards from unexpected inputs However, significant research has also focused on testing and discovering vulnerabilities by hand This leads towards injection attacks of various kinds: unknown input is usually the problem! We ll talk more about bug testing and injection attacks next week, leading towards browser injections

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#