Technische Universität Berlin, Germany Korea Advanced Institute of Science and
Faculty IV Electrical Engineering and Technology (KAIST), South Korea
Computer Science, Department of School of Computing
Telecommunication Systems Advanced Networking Lab
Internet Network Architectures (FG INET)
Master Thesis
Memory-safe Network Services Through A Userspace
Networking Switch
Kai Lüke
kailueke@riseup.net
Dual-Degree Master Computer Science
Supervisors: Prof. Anja Feldmann (TU Berlin)
Prof. Sue Moon (KAIST)
January 11, 2019
Erklärung der Urheberscha
             
           
 
   

              
          
   

Abstract
A network service needs to be resilient against malicious input from the Internet. Specially programs
wrien in C are prone to memory corruption bugs which are the basis for remote code execution at-
tacks. Memory-safe languages solve this problem for application code running in userspace. The TCP/IP
network stack however runs in the operating system kernel, which is wrien in C and vulnerable to mem-
ory corruption. Therefore, this work explored moving the TCP/IP stack into the memory-safe userspace
process while providing a compatible API. The process should share an IP address with the kernel and
integrate with the kernel’s loopback interface. This solution keeps the benefits of a full-featured OS and
does not impose different IPs per process or changes in the application logic. I analyzed the requirements
for deploying memory-safe TCP/IP services along with the kernel network stack. The existing switching
solutions for userspace network stacks do not meet these requirements because they do not handle un-
trusted packets in a memory-safe language and expose the kernel network stack to untrusted packets. I
present a memory-safe L4 soware switch that connects multiple userspace network stacks and the host
kernel network stack. The switch allows the kernel and userspace network stacks to share an IP address.
It also firewalls the host kernel network stack while supporting outgoing connections for updates. To
make memory-safe userspace networking easily usable I developed a socket library for Rust. Its in-app
TCP/IP stack provides the same socket API types as the standard library and is based on smoltcp. The
combination of a memory-safe userspace switch and userspace TCP/IP stack expands the memory-safety
of existing Rust web services to the TCP/IP layer with low porting efforts.
초록
사용자 공간의 네트워크 스위치를 사용한 메모리-안전한 네트워크 서비스
네트워 서비스 악성 입력 대해 구성을 져야 는데, 티시/아이피 씨로 현되어 오에 커널
에서 실행되어 모리 손상 버그 취약하다. 따라서 연구는 호환 능한 에이피아이를 제공하면서 티시/
이피 스택 메모-안전 사용 프로세스로 이동시키는 법을 개한다. 기존 식들은 패킷을 메모리-
언어 하지 않아 커널 워크 스택 성을 가지, 용자 트워 스택 워크
택을 연결하여 아이피 주소를 공유하는 메모리-안전 레이어 4 소프트웨어 스위치를 제시하며 이를 통해 방화벽으
커널 트워 택을 호한. 또한 메모-안전 용자공간 트워킹을 몰티시피 기반으로
스트용 소켓 라이브러리를 개발했으며 표준 라이브러리와 같은 타입의 소켓 에이피아이를 제공한다. 이러한 메모
-안전 용자공간 위치 용자공간 시피/이피 스택을 결합하여 력으로 기존 스트 서비
메모리안전성을 티시피/아이피 계층으로 확장시킬 있다.
Zusammenfassung
Ein Netzwerkdienst sollte robust sein gegen schädliche Eingabedaten aus dem Internet. Vor allem Pro-
gramme in C sind anällig ür Speicherkorruptionsfehler welche die Basis ür Remotecodeausührungsat-
tacken bilden. Speichersichere Sprachen lösen das Problem ür Anwendungscode, der im Userspace
läu. Jedoch läu der TCP/IP-Netzwerkstack im Betriebssystemkernel, welcher in C geschrieben ist
und damit anällig ür Speicherkorruption. Daher untersucht diese Arbeit das Verschieben des TCP/IP-
Stacks hinein in speichersichere Userspace-Prozesse bei Beibehaltung einer kompatiblen Programmier-
schnistelle. Der Prozess soll sich eine IP-Addresse mit dem Kernel teilen und sich in die Loopback-
Schnistelle integrieren. Diese Lösung behält die Vorteile eines vollausgestaeten Betriebssystems
bei und zwingt nicht unterschiedliche IP-Addressen pro Prozess auf oder Änderungen in der Anwen-
dungslogik. Ich analysierte die Anforderungen zum Bereitstellen von speichersicheren TCP/IP-Diensten
neben dem Kernel-Netzwerkstack. Die bisherigen Switch-Lösungen ür Userspace-Netzwerkstacks er-
üllen nicht die Anforderungen, weil sie nicht-vertrauenswürdige Pakete nicht in einer speichersicheren
Sprache verarbeiten und auch den Kernel-Netzwerkstack ihnen gegenüber aussetzen. Ich präsentiere
einen speichersicheren L4-Soware-Switch, der mehrere Userspace-Netzwerkstacks und den Kernel-
Netzwerkstack verbindet. Er erlaubt ihnen das Teilen einer IP-Addresse. Außerdem schützt er den
Kernel-Netzwerkstack durch eine Firewall, aber erlaubt ausgehende Verbindungen ür Updates. Um
speichersichere Netzwerkverarbeitung im Userspace einfach nutzbar zu machen habe ich eine Socket-
Bibliothek ür Rust entwickelt. Ihr TCP/IP-Stack läu im Anwendungsprozess und stellt die gleiche
Socket-Schnistellentypen wie die Standardbibliothek bereit auf Basis von smoltcp. Die Kombination
von speichersicherem Userspace-Switch und Userspace-TCP/IP-Stacks erweitert die Speichersicherheit
von bestehenden Webdiensten in Rust auf die TCP/IP-Schicht ohne große Portierungsanstrengungen.
Contents
Glossary ix
1 Introduction 1
2 Background 4
        
      
  
    
   
     
     
       
         
      
     
      
         
3 Analysis 19
        
       
        
     
    
       
       
4 Design 31
       
    
         
 
       
5 Prototype 42
      
      
6 Evaluation 48
    
      
       
7 Discussion 58
   
          
 
        
8 Conclusion 66
Bibliography 67
Glossary
ABI   
ASLR    
BPF   
CVE    
DoS   
eBPF    
ICMP    
IOMMU     
IPC  
L2    
L4     
MPTCP  
MTU   
NAT   
NFV   
TCB   
TLS   
POSIX    
QUIC       

1 Introduction
              
             
            
              
                 
            
            
               
           
     
               
            
               
            
               
            
             
        
              
            
               
             
               
              
              
                
 
             
               

               
            
               
              
              
           
   
            
                
               
              
             
           
               
                
              
                
            
              
           
             
Switch
Application
Userspace
Network Stack
NIC
Legacy
Application
Network Stack
Kernel
Figure 1.1:           
           
          
               
               
                
         
             
               
              
          
              
    
               
            
             
               
               
 
         
              
           
             
     
            
               
             
 
          
              
               
              
                 
              
          
               
             
             
             
         
2 Background
              
              
          
          
             
            
              
              
  
2.1 Mitigations, Soware Testing, and Soware Verification
             
              
            
            
               
             
            
             
             
            
           
            
           
              
               
             
              
2.2 Security of the Kernel Network Stack
            
                
           
                
             
              
               
                 
              
             
             
  
              
       
2.2 Security of the Kernel Network Stack
              
             
             
              
           
              
                
         
           
             
             
       
              
          
             
              
               
            
 

Table 2.1:            
  
            
          
           
          
     
         
              
              
               
               
              
               
              
              
                 
     
             
               
             
               
                
         
                
            
              
          
                 
               
              
               
  
              
            
              
                
                 
2.3 Fault Isolation
            
               
                 
              
              
            
                 
               
               
            
                 
               
               
                 
2.3 Fault Isolation
            
            
             
              
              
       network stack as a service      
               
             
              
              
              
2.4 Unikernels and Memory Safety
             
               
               
         

              
                   
            
             
             
           
              
    
           
                  
           
               
              
            
            
             
        
   
             
                
               
          
              
             
                 
              
            
2.5 Prior Memory-safe Networking
           
               
              
             
              
              
             
2.6 Networking with Go and Lua
             
          
 
              
               
               
                 
                 
                 
      
            
       
            
            
               
           
               
            

           
                
  
              
    
           
2.6 Networking with Go and Lua
             
               
               
              
             
              
 
                
              
                
                

              
           
              
    
2.7 Memory-safe Networking in Rust
            
             
              
              
                
                 
                 
             
             
                
           
               
               
             
             
             
            
              
             
              
              
              
            
      
2.8 Alternative OS Designs for Userspace Networking 
             
              
             
              
                
 
2.8 Alternative OS Designs for Userspace Networking
          
            
            
   
           
            
            
             
              
    
             
            
             
syscall scripts            
                
  
           
                 
              
               
               
             
          
            
          
 
          
               
             
             
               
              
             
                
             
              
   
            
                
              
 x          
  
     SOCK_DGRAM       
                
     
              
               
           
             
               
            
             

  vertical structured        
              
             
          
          
              
     
2.9 Packet Access and Switching with the Linux Kernel 
              
                
              
               
                
               

             
             
             
               
              
2.9 Packet Access and Switching with the Linux Kernel
           
               
              
              
              
    PACKET_MMAP         
             
              
               
               
         
              
             
               
                
                
                 
                
               
                 

 
               
            
         
              
             
               
             
                
             
             
              
                
    
               
             
                
              
             
                 
               
           
              
        AF_XDP       
               
               
         AF_XDP    
              
             
 AF_XDP          
2.10 Kernel Bypass Solutions for Linux
    PF_RING         
              
       
2.11 Soware Switches for Linux 
                
              
              
                
             
            
        AF_XDP    
                
                 
             
   
              
             
               
               
    
2.11 Soware Switches for Linux
               
        
             
            
                
            
              
              
              

            
                 
                
              
                
                
 
                
               
                

            
              
              
            
              
 
             
              
              
               
      
               
                 
               
            
 
           
               
                
             
        
2.12 Hardware Support for Packet Demultiplexing
             
            
               
                
              

2.13 APIs of Network Stacks in Userspace 
           
            
              
  
              
           
           hwTAP  
           
               
               
               
                
               
     
          
                
               
             
             
        
2.13 APIs of Network Stacks in Userspace
             
              
               
      LD_PRELOAD   LD_PRELOAD 
              
            
 
             
  LD_PRELOAD           read  write</