Embedded devices form the backbone of critical infrastructure, from SCADA systems monitoring and controlling industrial processes to the software running medical devices and transportation systems. With so much relying on these devices, securing them against attack is a top concern, particularly as nation-state actors continue to target critical infrastructure to gain a foothold into key systems. Securing embedded devices, however, is notoriously difficult.
Software manufacturers and asset owners across critical infrastructure run into several challenges when looking to improve the security of embedded systems, including resource constraints, the product lifespan, supply chain concerns, and following secure development best practices, like addressing memory safety.
Embedded devices are often resource-constrained, meaning they have limited processing power, memory, and energy. Adding security measures can have a negative effect on performance, making it impractical or difficult to add security features at the device level.
Embedded software products and programs typically have long lifespans, easily operating for 10 to 30 years. These systems are often difficult or impossible to patch, making them susceptible to a breach as new vulnerabilities emerge.
Embedded systems integrate hardware and software from a variety of vendors, increasing the attack surface. A vulnerability in software from a third-party could be exploited and compromise the entire system.
The widespread use of C/C++ in embedded systems across critical infrastructure leaves the door wide open for attackers to target memory-based vulnerabilities, like buffer overflows and use-after-free errors. The prevailing guidance is to rewrite C/C++ code into a memory safe language, like Rust. However, the cost to rewrite code could easily run into the millions and will take years to accomplish, leaving embedded systems vulnerable in the meantime.
Runtime protection is a security solution that allows embedded devices to defend themselves while deployed in the field, including from attacks like malware, code injection, backdoors, zero-day vulnerabilities, and memory-based attacks. It is ideal for protecting legacy systems where patching is difficult and where resource constraints are a major concern.
Many developers have likely heard of or deployed Address Space Layout Randomization (ASLR), a type of runtime protection that randomizes the base address of a program each time it is executed to help improve security against memory corruption vulnerabilities. ASLR, however, has its weaknesses. Because it relies on coarse-grained randomization, moving an entire program as one unit, it can be easily defeated by one information leak.
To address this, a new type of runtime protection, called Load-Time Function Randomization (LFR), takes things a step further to better defend embedded systems. LFR provides more granular protection by randomizing each function within a program every time the software is run, creating a unique memory layout with orders of magnitude greater entropy in code address layout than ASLR.
The ability to randomize memory at the device level every time software is run allows for proactive defense of embedded systems that prevents attackers from finding a path to exploitation.
One of the key advantages of runtime protection is its ability to secure software without requiring developers to rewrite existing code into memory safe languages. This is particularly valuable for embedded systems with legacy code bases.
Additionally, implementing runtime protection for embedded devices offers several significant benefits:
Runtime protection has an important role to play in defending embedded devices from known vulnerabilities that leave gaps in the security of our critical infrastructure and for defense against future threats. As we move forward, runtime protection will undoubtedly play an increasingly vital role in ensuring the long-term security and reliability of embedded systems and their resilience against attack.
Learn more about safeguarding the code underlying embedded software: Safeguarding Code: A Comprehensive Guide to Addressing the Memory Safety Crisis.