TOCTTOU Attacks Don Porter CS 380S

Slides:



Advertisements
Similar presentations
More on File Management
Advertisements

OPERATING SYSTEMS SHOULD PROVIDE TRANSACTIONS Donald E. Porter and Emmett Witchel The University of Texas at Austin.
Traps and Pitfalls: Practical Problems in System Call Interposition Based Security Tools Vinay Gangasani vcg
File System Interface CSCI 444/544 Operating Systems Fall 2008.
Dr. Kalpakis CMSC 421, Operating Systems. Fall File-System Interface.
Bilkent University Department of Computer Engineering
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 10: File-System Interface.
TOCTTOU Vulnerabilities in UNIX-Style File Systems BY: Mayank Ladoia.
Linux+ Guide to Linux Certification, Second Edition
6/24/2015B.RamamurthyPage 1 File System B. Ramamurthy.
Building Secure Software Chapter 9 Race Conditions.
CS 497C – Introduction to UNIX Lecture 16: - File Attributes Chin-Chih Chang
UNIX Files and Security Software Tools. Slide 2 File Systems l What is a file system? A means of organizing information on the computer. A file system.
7/15/2015B.RamamurthyPage 1 File System B. Ramamurthy.
A Mini UNIX Tutorial. What’s UNIX?  An operating system run on many servers/workstations  Invented by AT&T Bell Labs in late 60’s  Currently there.
System Calls 1.
Lesson 7-Creating and Changing Directories. Overview Using directories to create order. Managing files in directories. Using pathnames to manage files.
1 Lecture 2 Working with Files and Directories COP 3344 Introduction to UNIX.
Silberschatz, Galvin and Gagne  Operating System Concepts File Concept Contiguous logical address space Smallest user allocation Non-volatile.
Jan 26, 2004 OS Security CSE 525 Course Presentation Dhanashri Kelkar Department of Computer Science and Engineering OGI School of Science and Engineering.
OS provide a user-friendly environment and manage resources of the computer system. Operating systems manage: –Processes –Memory –Storage –I/O subsystem.
Linux+ Guide to Linux Certification, Second Edition
Consider the following Java code Race Conditions public class Shared { private int data; public Shared() { data = 0; } public void setData(int r) { data.
Old Chapter 10: Programming Tools A Developer’s Candy Store.
INTRODUCTION TO LINUX Jacob Chan. GNU/Linux Consists of Linux kernel, GNU utilities, and open source and commercial applications Works like Unix –Multi-user.
1 Multiprocessors May Reduce System Dependability Under File-based Race Condition Attacks Jinpeng Wei, Calton Pu Georgia Institute of Technology Atlanta,
UNIX Files File organization and a few primitives.
Managing Files. Module 5 Managing Files ♦ Introduction “On a Linux system, everything is a file; if something is not a file, it is a process.” ♦ Topics.
Introduction to System Admin Sirak Kaewjamnong. 2 The system administration’s job  Adding a new user  Doing backup and restoring files from backups.
Lecture 14 Page 1 CS 236 Online Race Conditions A common cause of security bugs Usually involve multiprogramming or multithreaded programs Caused by different.
Project 6 Unix File System. Administrative No Design Review – A design document instead 2-3 pages max No collaboration with peers – Piazza is for clarifications.
Linux+ Guide to Linux Certification, Third Edition
Linux+ Guide to Linux Certification, Third Edition
1 © 2001 John Urrutia. All rights reserved. Chapter 4 The LINUX Filesystem.
Unix Security Assessing vulnerabilities. Classifying vulnerability types Several models have been proposed to classify vulnerabilities in UNIX-type Oses.
Manage Directories and Files in Linux Part 2. 2 Identify File Types in the Linux System The file types in Linux referred to as normal files and directories.
Λειτουργικά Συστήματα – Lab2 Γιάννης Πετράκης. Directory Navigation and Control  The Unix file system is set up like a tree branching out from the root.
The Unix File system (UFS) Presented by: Gurpreet Singh Assistant Professor Department of School of Computing and Engineering Galgotias University.
1 Lecture 2 Working with Files and Directories COP 3353 Introduction to UNIX.
14.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition Chapter 10 & 11: File-System Interface and Implementation.
CIT 383: Administrative ScriptingSlide #1 CIT 383: Administrative Scripting Directories.
UNIX filesystem CS 2204 Class meeting 2 *Notes by Doug Bowman and other members of the CS faculty at Virginia Tech. Copyright
Lecture 02 File and File system. Topics Describe the layout of a Linux file system Display and set paths Describe the most important files, including.
The Kernel At a high level, the kernel in an operating system serves as the bridge between applications and the actual data processing of the hardware.
Race conditions and synchronization issues Exploiting UNIX.
Chapter Linux Basics. Acknowledgements This presentation was prepared by – Banyat Settapanich – Bahran Madaen This presentation will be updated later.
UNIX file systems Learning Objectives: 1. To understand the basics of file systems 2. To understand the hierarchical structure in Unix file system 3. To.
I/O Software CS 537 – Introduction to Operating Systems.
Lecture 14 Page 1 CS 111 Online File Systems: Naming, Reliability, and Advanced Issues CS 111 On-Line MS Program Operating Systems Peter Reiher.
W4118 Operating Systems Instructor: Junfeng Yang.
CSS430 File System1 CSS430 File-System Interface Textbook Ch11 These slides were compiled from the OSC textbook slides (Silberschatz, Galvin, and Gagne)
Python: File Directories What is a directory? A hierarchical file system that contains folders and files. Directory (root folder) Sub-directory (folder.
Linux Filesystem Management
File System Interface CSSE 332 Operating Systems
Lecture 2 Working with Files and Directories
Module 10: File-System Interface
CS Introduction to Operating Systems
Unix : Introduction and Commands
File System B. Ramamurthy B.Ramamurthy 11/27/2018.
Lecture 43 Syed Mansoor Sarwar
UNIX File System Go Climb a Tree Weiyu Zhang (96142)
Chapter 10: File-System Interface
CSE 451 Fall 2003 Section 11/20/2003.
Module 6 Working with Files and Directories
Module 10: File-System Interface
Chapter 4: The Linux Filesystem
January 26th, 2004 Class Meeting 2
Race Condition Vulnerability
SHELLSHOCK ATTACK.
Presentation transcript:

TOCTTOU Attacks Don Porter CS 380S Some slides courtesy Vitaly Shmatikov and Emmett Witchel

Definitions TOCTTOU – Time of Check To Time of Use Check – Establish some precondition (invariant), e.g., access permission Use – Operate on the object assuming that the invariant is still valid Essentially a race condition Most famously in the file system, but can occur in any concurrent system Check: e.g., the file exist, the current user has write privilege to the file… Why check? To avoid misuses of privileges.

UNIX File System Security Access control: user should only be able to access a file if he has the permission to do so But what if user is running as setuid-root? E.g., a printing program is usually setuid-root in order to access the printer device Runs “as if” the user had root privileges But a root user can access any file! How does the printing program know that the user has the right to read (and print) any given file? UNIX has a special access() system call

TOCTTOU Example – setuid Victim checks file, if its good, opens it Attacker changes interpretation of file name Victim reads secret file Victim Attacker if(access(“foo”)) { fd = open(“foo”); read(fd,…); … } symlink(“secret”, “foo”); Check: e.g., the file exist, the current user has write privilege to the file… Why check? To avoid misuses of privileges. time

access()/open() Exploit Goal: trick setuid-root program into opening a normally inaccessible file Create a symbolic link to a harmless user file access() will say that file is Ok to read After access(), but before open() switch symbolic link to point to /etc/shadow /etc/shadow is a root-readable password file Attack program must run concurrently with the victim and switch the link at exactly the right time Interrupt victim between access() and open() How easy is this in practice?

Broken passwd Password update program on HP/UX and SunOS (circa 1996) [Bishop] Password update program on HP/UX and SunOS (circa 1996) When invoked with password file as argument… Open password file and read the entry for the invoking user Create and open temporary file called ptmp in the same directory as password file Open password file again, update contents and copy into ptmp Close both password file and ptmp, rename ptmp to be the password file

TOCTTOU Attack on passwd Create our own subdirectory FakePwd and fake password file pwdfile with blank root password; create symbolic link lnk->FakePwd; run passwd on lnk/pwdfile 1. Open password file and read the entry for the invoking user Change lnk->RealPwd to point to real password directory 2. Create and open temporary file called ptmp in the same directory as password file ptmp is created in RealPwd Change lnk->FakePwd to point to fake password directory 3. Open password file again, update contents and copy into ptmp contents read from FakePwd/pwdfile and copied to RealPwd/ptmp 4. Close both password file and ptmp, rename ptmp to password file Now RealPwd/pwdfile contains blank root password. Success!

Directory Removal Exploit Recursive removal of a directory tree (GNU file utilities) Original tree is /tmp/dir1/dir2/dir3 chdir(“/tmp/dir1”) chdir(“dir2”) chdir(“dir3”) unlink(“*”) chdir(“..”) rmdir(“dir3”) rmdir(“dir2”) rmdir(“/tmp/dir1”) Suppose attacker executes “mv /tmp/dir1/dir2/dir3 /tmp” right here This call will delete the entire root directory! Fix: verify that inode of the directory did not change before and after chdir()

Temporary File Exploit Suppose attacker creates a symbolic link with the same name as *fn pointing to an existing file This will overwrite the file to which attacker’s link points // Check if file already exists if (stat(fn,&sb)==0) { fd = open(fn, O_CREAT | O_RDWR, 0); if (fd<0) { err(1, fn); }

Evading System Call Interposition TOCTTOU and race conditions can be used to evade system call interposition by sharing state Example: when two Linux threads share file system information, they share their root directories and current working directory Thread A’s current working directory is /tmp Thread A calls open(“shadow”); B calls chdir(“/etc”) Both look harmless; system monitor permits both calls open(“shadow”) executes with /etc as working directory A’s call now opens “/etc/shadow” – oops! Similar attacks on shared file descriptors, etc.

Non-Filesystem Race Conditions Sockets: create/connect races for local daemons OpenSSH < 1.2.17 Symbolic links for Unix sockets Plash Signal handlers See Zalewski – “Sending signals for Fun and Profit”

TOCTTOU Vulnerabilities in Red Hat 9 National Vulnerability Database currently has 600 entries for symlink attack Application TOCTTOU errors Possible exploit vi <open, chown> Changing the owner of /etc/passwd to an ordinary user gedit <rename, chown> rpm <open, open> Running arbitrary command emacs <open,chmod> Making /etc/shadow readable by an ordinary user Jinpeng Wei, Calton Pu. FAST’05

How Hard Is It to Win a Race? Idea: force victim program to perform an expensive I/O operation While waiting for I/O to complete, victim will yield CPU to the concurrent attack program, giving it window of opportunity to switch the symlink, working dir, etc. How? Make sure that the file being accessed is not in the file system cache Force victim to traverse very deep directory structures (see Borisov et al. paper for details)

Maze Attack Replace /tmp/foo -> bar with: /tmp/foo -> 1/a/b/c/d/e/... -> 2/a/b/c/d/e/... ... -> k/a/b/c/d/e/... -> bar

Maze Attack, cont. /tmp/foo -> 1/a/b/c/d/e/... 1a/a/b/c/d/e/... -> k/a/b/c/d/e/... -> bar 1a/a/b/c/d/e/... ->2a/a/b/c/d/e/... ... ->ka/a/b/c/d/e/... -> secret Pollute OS cache with unrelated garbage Pick an arbitrary file in maze, poll atime On update, replace maze

Maze Recap Attacker must track victim’s progress After access started: [Borisov et al.] Attacker must track victim’s progress When to insert symlink? After access started: Monitor access time on a single directory entry Before open: Force disk reads during access Draw picture on board

How hard to prevent TOCTTOU? No portable, deterministic solution with current POSIX filesystem API – Dean and Hu 2004 Tactics: Static checks for dangerous pairs (compile time) Hacks to setuid programs (least privilege) Kernel detection and compensation (RaceGuard) User-mode dynamic detection Change the interface

Hardness Amplification (Dean) If probability of attacker winning race is p<1, Essentially, do the access() n times and make sure they agree before doing the open() But what about mazes? p == 1

Take 2 – (Tsafrir ‘08) Idea: Column-oriented traversal in userspace /a/b/c/... Insight: hard to force scheduling in same directory Notes: User space Probabilistic k a b c ... Draw on board a b c ... n a b c ... ...

Cai et al. ‘09 Idea: Algorithmic complexity attack on filesystem namespace Forced victim to be descheduled at end of each syscall without mazes Even in same directory Paper also includes interesting scheduler priority manipulation

Linux dcache “foo” hashes to 3 Pollute bucket 3 with garbage Victim burns timeslice traversing very long hash chain OS schedules attacker at end of syscall ...

Cai recap Disproved intuition about column traversal Generalization: probabilistic countermeasures unlikely to every work Attackers likely to figure out how to single step victim Deterministic solutions are the only solutions

Tsafrir made Deterministic Insight 2: Hardness amplification not necessary Userspace traversal sufficient with *at() calls: fd1 = open(“/”); fstatat(fd1, &statbuf); // do some checks fd2 = openat(fd1, “a”); fstatat(fd2, &statbuf); // more checks fd3 = openat(fd2, “b”); ...

Caveats Slower (many more syscalls) Incompatible with exec, O_CREAT Re-opens door to temp file attacks Still requires API changes openat(), fstatat(), etc.

How hard to prevent TOCTTOU? Tactics: Static checks for dangerous pairs (compile time) - Difficult in practice Hacks to setuid programs (least privilege) - Most common fix for single app Kernel detection and compensation (RaceGuard) User-mode dynamic detection Probabilistic Deterministic – Requires API Changes, Incomplete Change the interface - Most common approach to general problems

Adapting the API In the last 2 years, 13 new system calls have been added to Linux to prevent TOCTTOU openat, renameat, etc. all take file descriptors In the last 3 years, new signal handling pselect, ppoll change signal mask Current proposals for close-on-exec flag to the open system call Prevents a race between open and fcntl (exploitable in a web browser) Cluttered and complicated APIs are the enemy of secure code

Transactions Atomic: either the entire transaction succeeds or fails Consistent: transactions represent a consistent data structure update Isolated: partial results are not visible to the rest of the system. This allows all transactions to be ordered (serialized). Durable: they survive computer failures Transactions help us reason about concurrency

Pseudo-Transactions [Tsyrklevich and Yee] Observation: many sequences of filesystem operations are intended to be atomic E.g., nothing should happen betw. access() and open() Pseudo-transaction: a sequence of filesystem calls that always behaves as if it were executed in isolation and free from interference Very well-understood concept in databases Idea: OS should recognize when a file transaction starts and prevent interfering system calls

Tsyrklevich-Yee System Look at 2-call sequences of filesystem calls Implemented as a kernel module Assume that first call starts a pseudo-transaction, second call ends it Also need to time out misidentified transaction starts Treat all filesystem operations originating from the same process as part of same transaction Assume process doesn’t maliciously interfere with its own filesystem access Assume fork()’d children run the same process image

…Also destroyed by Cai et al. ‘09 Kernel has finite resources to track fs operations Idea: pollute the cache with enough garbage to evict first operation Or manipulate scheduling for false timeout Varies by implementation

System Transactions – SOSP ‘09 New system calls for transactions sys_xbegin sys_xend sys_xabort System calls within an active transaction atomic: all or nothing isolated: partial results invisible Easy to adopt, just wrap code with transactions Deterministic guarantees

TOCTTOU Example Redux Attack ordered before or after check and use System transactions save the day Victim Attacker symlink(“secret”,“foo”); symlink(“secret”,”foo”); sys_xbegin(); if(access(“foo”)) { fd = open(“foo”); sys_xend(); … time

Prototype A version of Linux 2.6.22 modified to support system transactions Affectionately called TxOS Runs on commodity hardware Supports a range of system calls fs, memory allocation, fork, signals Reasonably efficient Benchmark overheads: 1-2x Some speedups!

Questions? porterde@cs

Preventing TOCTTOU Races

Typical Setuid-Root File Access // Assume this is running inside some setuid-root program void foo(char *filename) { int fd; if (access(filename, R_OK) != 0) exit(1); fd=open(filename, O_RDONLY); … do something with fd … } Check if user has the permission to read this file What if the file to which filename points changed right here? Open file for reading This is known as a TOCTTOU attack (“Time of Check To Time of Use”)

Fixing Race Conditions Unsafe sequence has been detected. What now? Roll back to state before transaction Requires a heavy-duty file system Lock out other processes when a “critical section” of filesystem operations is being executed How to identify critical sections? One process gets a lock on entire filesystem (bad idea) “Delay-lock”: temporarily delay other processes trying to access a locked file How to calculate the right delay? What if attacker wakes up before victim completes his file operation?

Default Allow Policy Allow every 2-call sequence except these: ACCESS REMOVE CHDIR REMOVE EXEC REMOVE where REMOVE = UNLINK | RMDIR | RENAME

Default Deny Policy Deny any 2-call sequence except these: PERMIT(OPEN_RW, OPEN_RW | ACCESS | UTIMES | CHDIR | EXEC | UNLINK | READLINK | CHMOD | CHOWN | RENAME) PERMIT(OPEN_CREAT, OPEN_RW | ACCESS | UTIMES | CHDIR | EXEC | RENAME_FROM) PERMIT(ACCESS, OPEN_RW | ACCESS | UTIMES | CHDIR | EXEC) PERMIT(EXEC, OPEN_READ | EXEC) PERMIT(CHDIR, OPEN_READ | CHDIR | ACCESS | READLINK) PERMIT(RENAME_FROM, OPEN_RW | ACCESS | UNLINK | RENAME_FROM) PERMIT(RENAME_TO, OPEN_RW) PERMIT(CHMOD | CHOWN, OPEN_RW | ACCESS | CHMOD | CHOWN) PERMIT(UTIMES, OPEN_RW | ACCESS | CHMOD | CHOWN) PERMIT(READLINK, READLINK)