Embedded Software Engineering

How can analysis and assurance become practical for embedded software?

Four lines of attack on reliable embedded software
Four complementary lines of work meet at practical assurance. Understanding failure asks what goes wrong in real embedded software, through studies of packet validation and layering violations. Making code reachable asks how firmware can be analyzed away from its target hardware, through rehosting, LEMIX and bottom-up testing. Analyzing at scale asks whether useful analyses can become cheap enough to apply broadly, using CodeQL and OSS-Fuzz-Gen. Establishing guarantees asks whether verification can become an ordinary engineering step, through Unit Proofing, compositional bounded model checking and AutoSOUP.

Embedded software runs where failures are expensive, and in conditions that defeat the assumptions most analysis tools are built on: no operating system to speak of, hardware that the analysis cannot reach, and code that cannot simply be run in a test harness.

Our work has attacked that gap in stages. We studied defects in real embedded network stacks, built rehosting infrastructure so firmware can execute away from its target hardware, and applied static analysis at a scale where it finds hundreds of defects across many projects. A current thrust, Unit Proofing, asks whether component-level formal verification can be made cheap enough to use as an ordinary engineering step rather than a special occasion.

Understanding embedded failures

Embedded software runs where failures are expensive, under conditions that defeat the assumptions most analysis tools are built on. This work establishes what actually goes wrong, and why the usual techniques do not reach it.

Making the code reachable

Analysis cannot begin until the software can be executed and inspected away from the hardware it was written for. Rehosting turns embedded applications into something ordinary tools can work on.

Analysis at ecosystem scale

Once analysis is affordable, the question becomes what it finds when pointed at many real projects rather than one.

From defect detection to guarantees

A found defect is weaker than a guaranteed absence. The current thrust asks whether component-level verification can be made cheap enough to use as an ordinary engineering step.

Funding and support

This work has been supported by:

  • Rolls-Royce — Securing Software Implementations through System Fuzz Testing and Modular Formal Methods
  • Qualcomm, Inc. — Qualcomm Innovation Fellowship
  • OpenAI — Cybersecurity Grant Program — AutoUP: Automated Unit Proofing
  • Rolls-Royce — Facilitating Effective Dynamic Analysis of Embedded Software
  • Rolls-Royce — Dynamic Security Analysis of Embedded Software Systems
  • Rolls-Royce — Dynamic Analysis of Embedded Firmware