+ All Categories
Home > Documents > Verification of Linux Kernel without Loadable Kernel...

Verification of Linux Kernel without Loadable Kernel...

Date post: 26-Sep-2020
Category:
Upload: others
View: 10 times
Download: 0 times
Share this document with a friend
29
Verification of Linux Kernel without Loadable Kernel Modules Evgeny Novikov and Ilja Zakharov ISP RAS, Linux Verification Center CPA&LDV’18, Moscow, September 26, 2018
Transcript
Page 1: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

Verification of Linux Kernelwithout Loadable Kernel Modules

Evgeny Novikov and Ilja ZakharovISP RAS, Linux Verification Center

CPA&LDV’18, Moscow, September 26, 2018

Page 2: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

2

Linux Kernel Architecture

Kernel

Page 3: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

3

Linux Kernel Architecture

Helper module 1

Helper module 2

Module 1 Module 2

Helper module 3

Module 3 Module 4 Module 5

4373 modules(Linux 3.14, x86_64, allmodconfig)

Kernel

Page 4: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

4

Size of Linux Kernel without Loadable Kernel Modules (Later – Linux Kernel)

4.8

4.2

3.16

3.103.

4

2.6.

38 4.5

3.19

3.133.

73.

1

2.6.

35

2.6.

32600

700

800

900

1000

1100

1200

1300

1400

1500

Linux kernel version

Lin

es

of

cod

e,

tho

usa

nd

s

Average size of modulesis ~2 KLOC

Page 5: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

5

Challenge

Linux kernel operates on billions of devicesused by billions of people,

thus,requirements for its functionality, security, reliability and

performance are ones of the highest

Page 6: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

6

Related Work

● Using special programming languages, tools and hardware– Helps just in some cases

● Code review, testing, static analysis– Does not aim at detecting all violations of checked requirements

● Deductive verification– Needs too much human efforts (~1 man-year per 1 KLOC)

● Software verification– Seems to be the only appropriate approach for scalable heavy-weight formal

verification of software

Page 7: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

7

Outline

● Background– Linux kernel subsystems

– Software verification tools

– Klever software verification framework

● Verification of Linux kernel– Decomposing Linux kernel into subsystems

– Verifying Linux kernel subsystems together with device drivers

– Generating environment models for Linux kernel subsystems

– Checking requirements for Linux kernel subsystems

– Improving verification results

● Implementation and evaluation

Page 8: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

8

Linux Kernel Subsystems

Page 9: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

9

Linux Kernel Subsystems Operation

Initialization

Event handling

Termination

Page 10: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

10

Initialization of Linux Kernel Subsystems

● Each subsystem defines one or more initialization functions

● Startup function start_kernel() initializes the most vital subsystems first of all

● Most of subsystems are initialized in accordance with their levels specified via macros taking initialization function names as arguments, e.g. Linux 3.14 has 19 such the levels

● Some subsystems initialize other ones

Page 11: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

11

Event Handling in Linux Kernel Subsystems

● Subsystems define and register callbacks for handling events

● Subsystems define helper functions invoked during handling events by other subsystems and loadable kernel modules

Page 12: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

12

Termination of Linux Kernel Subsystems

● Subsystems operate until normal or abnormal reboot

● There are no exit functions

● Subsystems do not perform final clean up

Page 13: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

13

Software verification tools

● Capable to check industrial programs of thousands or dozens of thousands of lines of code in size

● Need rather accurate environment models

● Allow to check various requirements (usually non-functional ones)

Page 14: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

14

Klever software verification framework

● Is designed for checking various GNU C programs

● Includes specifications allowing:– to generate rather accurate environment models for invoking most popular

device driver APIs

– to check various requirements in device drivers

Page 15: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

15

Outline

● Background– Linux kernel subsystems

– Software verification tools

– Klever software verification framework

● Verification of Linux kernel– Decomposing Linux kernel into subsystems

– Verifying Linux kernel subsystems together with device drivers

– Generating environment models for Linux kernel subsystems

– Checking requirements for Linux kernel subsystems

– Improving verification results

● Implementation and evaluation

Page 16: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

16

Decomposing Linux Kernel into Subsystems

● Treat all source files from specified directories built into Linux kernel as subsystems and add/remove individual source files by hand– Simple update of configuration for new versions of Linux kernel

– Allow obtaining quite compact subsystems

Page 17: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

17

Verifying Linux Kernel Subsystems together with Device Drivers

● Verify each subsystem with all device drivers that use its interfaces one by one– Too much time for verification but all possible interaction scenarios are

covered

● Select those device drivers that increase function coverage in the best way– Compromise between verification time and quality

Page 18: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

18

Generating Environment Models for Linux Kernel Subsystems

● Generator for initializing subsystems and device drivers– Needs specifications relating subsystems initialization levels and functions

● Generator for invoking callbacks (the same as for device drivers)– Reuses relevant environment model specifications for device drivers

– Needs subsystem specific specifications

● Modeling remaining environment– Extending intermediate representation of environment model

– Developing models for vital undefined functions

Page 19: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

19

Checking Requirements for Linux Kernel Subsystems

● Check those requirements that are checked for device drivers and relevant for subsystems:– Rules of correct usage of the Linux kernel API

– Memory safety

– Concurrency safety

● Adjust requirement specifications– Do not check final state

Page 20: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

20

Improving Verification Results

● Until obtaining reasonable coverage and acceptable number of false alarms one needs step by step:– to adjust tool configurations describing target subsystems and device drivers

verified together with them

– to refine environment model and requirement specifications

Page 21: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

21

Outline

● Background– Linux kernel subsystems

– Software verification tools

– Klever software verification framework

● Verification of Linux kernel– Decomposing Linux kernel into subsystems

– Verifying Linux kernel subsystems together with device drivers

– Generating environment models for Linux kernel subsystems

– Checking requirements for Linux kernel subsystems

– Improving verification results

● Implementation and evaluation

Page 22: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

22

Evaluation

● Klever Git branch kernel-verification– default specifications and tool configurations

● CPAchecker Subversion revision trunk:27583– configuration ldv-bam for reachability

– configuration smg-ldv for memory satety

– 15 minutes of CPU time and 10 GB of memory per each verification task

● Linux kernel– architecture x86_64

– configuration allmodconfig

Page 23: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

23

Target Subsystems (Linux 3.9 – 3.19)

Subsystem name Directory Source files Lines of code

Character Devices Support (CHAR) drivers/char 5 4194

General-Purpose I/O (GPIO) drivers/gpio 6 4472

Terminal Devices Support (TTY) drivers/tty 11 12129

Subsystem name Source files added/removed Lines of code added/removed

CHAR +0/-1 (+0%/-20%) +950/-712 (+23%/-17%)

GPIO +2/-3 (+33%/-50%) +5074/-3079 (+113%/-69%)

TTY +1/-0 (+9%/-0%) +4012/-3221 (+33%/-27%)

Page 24: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

24

Function Coverage for Target Subsystems

Page 25: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

25

Reasons of Absence of Function Coverage for Target Subsystems (Linux 3.14)

Page 26: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

26

Average Number of Verdicts for Target Subsystems (12 Requirement Specifications)

Page 27: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

27

Detecting Known Faults in Target Subsystems

Subsystem name Commit hash Requirements specification Detection status

CHAR 08d2d00b291eb5325a02aa8461c6375d5523

generic:memorygeneric:memorygeneric:memory

✗(another architecture)✓(extra source files)✗(another configuration)

GPIO e9595f84a62700acc3dc2480

generic:memorylinux:kernel:locking:spinlock

✓(extra source files)✓

TTY b216df53848107584d4a356e1d9e689c934b

generic:memorylinux:kernel:modulegeneric:memory

✗(needs specification)✓(dead code)✗(too complex)

Page 28: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

28

Conclusion

● We developed a new method that:– enables rather thorough checking and finding hard-to-detect faults for

subsystems of various versions of the Linux kernel

– does not require considerable efforts for configuring tools and developing specifications

● We could detect:– one fault in GPIO Linux kernel subsystem

– 2 unreported faults in Linux kernel device drivers

– 4 of 8 known faults after slight adjustment

● There is room for improvement primarily by means of developing specifications

Page 29: Verification of Linux Kernel without Loadable Kernel Moduleslinuxtesting.org/downloads/ldv-cpa18/20180926_CPA18...2018/09/26  · 4 Size of Linux Kernel without Loadable Kernel Modules

29

Questions?

Novikov E. and Zakharov I. Verification of Operating System Monolithic Kernels without Extensions. Proceedings of the 8th International Symposium On Leveraging Applications of Formal Methods, Verification and Validation, 2018


Recommended