
TL;DR, we challenge the cyber security status of ROS and ROS-Industrial packages within Melodic
experimentally by a) constructing a synthetic industrial scenario, b) hardening it according to industrial and existing available recommendations and c) performing a targeted security exercise, namely red teaming. We found ROS/ROS-I computational graph vulnerable to a variety of attacks and managed to take control of the underlying robots.
For more, refer to the following resources:
Red teaming ROS-Industrial case study
-
Red teaming ROS-Industrial extended report (white paper)
(56 pages)
Red teaming
Red teaming is a full-scope, holistic and targeted (with specific goals) attack simulation designed to measure how well a system can withstand an attack. Opposed to Penetration Testing (pentesting or PT), a red teaming activity does not seek to find as many vulnerabilities as possible to risk-assess them, but has a specific goal. Red teaming looks for vulnerabilities that will maximize damage and meet the selected goals. Its ultimate objective is to test an organization/system detection and response capabilities in production and with respect a given set of objectives.
Past works in robot cybersecurity criticize the current status of cybersecurity in robotics and reckon the need of further research. Previous attempts to review the security of robots via offensive exercises or tools mostly focus on proof-of-concept attacks and basic penetration testing, detecting flaws in ROS.

Goals for the offensive security exercise
- Goal G_1: Control, deny access or disrupt the ROS computational graph.
- Goal G_2: Control, deny access or disrupt the operation of robots (ROS-powered or not).
Findings
Attack | Description | Goals met |
---|---|---|
A_{1.1}: remove arbitrary code execution | Subject to some prior interactions, attacker with control of D_1 is able to exploit a vulnerability in ROS and launch arbitrary remote code executions from a privileged ROS end-point compromising completely the computational graph | G_1 and G_2 (R_1, R_2, R_3, R_4 and R_5) |
A_{1.2}: privilege escalation | Subject to local access, attacker is able to exploit a vulnerability in ROS and escalate privileges (to the ROS ones) in such machine | G_1 |
A_{2}: FIN-ACK flood attack targeting ROS | Attacker attempts to deny ROSTCP connection on target destination by forcing a maxed-out number of connections | G_1 and G_2 (R_1, R_2, R_3, R_4 and R_5) |
A_3: PitM attack to a ROS control station & Attacker poisons ARP tables and gains access to the network flow of information siting between targeted publishers and subscribers, interfering with communications as desired. | G_1 and G_2 (R_1, R_2, R_3, R_4 and R_5) | |
A_4: Insider endpoint via unprotected robot controller | Attackers exploit known vulnerabilities in a robot endpoint to compromise the controller and pivot into the ROS network. | G_1 and G_2 (R_1, R_2, R_3, R_4, R_5 and R_6) |
G_1 is achieved in all the presented attacks whereas G_2 is mostly achieved yet depends on the hardening of the corresponding control stations and robotic endpoints.
At the time of writing, among the vulnerabilities we exploited most remain active. An exception is RVD#2401 which got resolved by Open Robotics within 30 hours from the moment we submitted a mitigation. This further confirmed that
Lessons learned
Through our experiments we showed how control stations running Ubuntu 18.04 do not protect ROS or ROS-Industrial deployments. Moreover, the guidelines offered by Canonical for securing ROS are of little use against targeted attacks, as demonstrated. Certain ongoing hardening efforts for ROS Melodic (e.g. the CIS Benchmark for Melodic) helped mitigate some issues but regardless, most goals were still achieved with attacks targeting threats like zero days, wide and availability of industrial components, inadequate security practices or non-patched OS and firmware.
Dedicated robotic security protection systems like the Robot Immune System (RIS) used in \hat{C_2}, \hat{C_5} or \hat{C_6} managed to secure the corresponding robot avoiding directed attacks however R_2 and R_5 robots were stillhijacked by compromising the ROS computational graph via their control stations. RIS was not able to stop these attacks because they came from trusted sources whose behavior was learned over a prior training phase. An exception was R_6 which we were not able to compromise thanks to RIS being installed at \hat{C_6} whereas R_3 (not protected) was easily compromised and used as a rogue endpoint for attackers to pivot into other malicious endeavors. From this, we conclude that industrial scenarios like the one presented in this use case using ROS must not only follow ICS guidelines but also harden robot endpoints and the ROS computational graph.
Due to constraints on resources and time, the following items remain open and might be tackled in future work:
-
We showed how Ubuntu Bionic 18.04 was not a valid starting point for secure ROS (Melodic Morenia) industrial deployments. In the future we will look into other Linux file systems and Operating Systems as a starting point. Particularly and given Windowsâ popularity in industry and its recent activity and support of ROS for development, we recommend its security evaluation in future research efforts.
-
The security mechanisms in the Robot Immune System (RIS) do not currently allow it to detect threats on its interconnecting components (other devices) and seems a difficult endeavour since it would require RIS (at the endpoint) to constantly monitor and exchange communications with other segments of the industrial network (which will further compromise some of the segmentation and segregation assumptions). Instead, we believe future work should focus on a) reviewing the interoperability services offered by RIS in the robotic endpoint while ensures Zero Trust principles are applied and b) guarantee ROS computational graphs can be hardened regardless of their packages.
-
We only applied a subset of ISA/IEC 62443 and was included into the use case scenario via the hardening step. Future work should extend our setup and complement it with additional security measures following this norm. Though we strongly believe this is of valuable research interest, our interactions with industrial operators indicate that the level of compliance with ICS standards is still on its early phases. Correspondingly, we reckon that the use case assumed while synthetic, captures an already high degree of security measures when compared to real scenarios.
-
While we failed to find exploitable security flaws within the triaged ROS-Industrial drivers, further work needs to be put into mitigating existing ones archived in RVD. Moreover, we encourage for a periodic review of the drivers using both static and dynamic testing.
-
We consider it would be extremely interesting to analyze the dynamics of having heterogeneous robots, from different vendor in a security case study. Future work might consider to extend the scenario we assumed with robots from mixed vendors, mixing ROS packages and incurring into a much more complex software engineering security scenario.
Conclusions
We presented four targeted attacks over a synthetic industrial scenario constructed by following international ICS cybersecurity standards where the control logic is operated by ROS and ROS-Industrial packages. Our attacks exploited both new and known vulnerabilities of ROS achieving the two goals we set. We managed to execute code remotely (A_1) in a ROS end-point, disrupt the ROS computational graph (A_2), impersonate a ROS control station through PitM (A_3) and finally use an unprotected robot endpoint to pivot into the ROS network (A_4).
The original research question posed whether ROS could be used securely on industrial use cases. Based on our experimental results, we found: With the current status of ROS, it is hardly possible to guarantee security without additional measures.
Acknowledgements
This research has been partially funded by the European Unionâs Horizon 2020 research and innovation programme under grant agreement No 732287 under ROSin project through the FTP RedROS-I. Thanks also to the Basque Government, throughout the Business Development Agency of the Basque Country (SPRI). Special thanks to BIC Araba and the Basque Cybersecurity Centre (BCSC) for the support provided. This research was also financially supported by the Spanish Government through CDTI Neotec actions (SNEO-20181238).
The following names presented in no particular order helped, advised or supported bringing up this work: Bernhard Dieber, Stefan Rass, Martin Pinzger, Alejandro HernĂĄndez Cordero, Alfonso Glera, Odei Olalde, Lander Usategui San Juan, Gorka Olalde, Xabier Perez-Baskaran, Iñigo Ibiriku, Oxel Urzelai and Nuria GarcĂa.
Reproduction and results availability
Our setup can be reproduced using the following:
alurity.yaml file to reproduce our setup
############
# Networks
############
networks:
# Level 1: Control Networks, connect controllers and control stations
# for each controller, we expect a dedicated control-network w
- network:
- name: control-network_c1_s1
- driver: overlay
- internal: true
- encryption: false
- subnet: 12.0.0.0/24
- network:
- name: control-network_c2_s2
- driver: overlay
- internal: true
- encryption: false
- subnet: 12.0.2.0/24
- network:
- name: control-network_c4_s4
- driver: overlay
- internal: true
- encryption: false
- subnet: 12.0.4.0/24
- network:
- name: control-network_c5_s5
- driver: overlay
- internal: true
- encryption: false
- subnet: 12.0.5.0/24
# Level 2: Process Network
- network:
- name: process-network
- driver: overlay
- internal: true
- encryption: false
- subnet: 13.0.0.0/24
# Level 3: DMZ 2 sub-network
# NOTE: used to interface Process Network with machines in DMZ 2
# (e.g. a historian, additional servers and related)
- network:
- name: dmz2
- driver: overlay
- internal: true
- encryption: false
- subnet: 14.0.0.0/24
# Level 4: IT Network
- network:
- name: it-network
- driver: overlay
- encryption: false
- internal: true
- subnet: 15.0.0.0/24
# Level 3: DMZ 1 sub-network
# NOTE: used used to interface IT Network with central control station
- network:
- name: dmz1
- driver: overlay
- encryption: false
- internal: true
- subnet: 16.0.0.0/24
# Beyond lvl4: Cloud
- network:
- name: cloud-network
- driver: overlay
- encryption: false
- internal: false
- subnet: 17.0.0.0/24
#################################
# Firewalls and network elements
#################################
firewalls:
- container:
- name: firewall-it-dmz1
- ingress: it-network
- egress: dmz1
- rules:
- iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
- iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
- iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
- iptables -A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT
- route add 13.0.0.20 gw 16.0.0.254 eth2
- container:
- name: firewall-process-dmz2
- ingress: process-network
- egress: dmz2
- rules:
- iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
- iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
############
# Containers
############
containers:
#
# Controllers
#
# C1
- container:
- name: "c1"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
# - base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.12.1
# - base: registry.gitlab.com/aliasrobotics/offensive/projects/rosin-redros-i:3.12.1-controller
- network:
- control-network_c1_s1
# - field-network_r1_c1
- ip: 12.0.0.20 # assign manually an ip address
- cpus: 4
- memory: 2048
- mount: Controller:/root/.urcaps/
# C^2
- container:
- name: "c2"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
# - base: registry.gitlab.com/aliasrobotics/offensive/projects/rosin-redros-i:3.12.1-controller
- network:
- control-network_c2_s2
# - field-network_r2_c2
- cpus: 4
- memory: 2048
- mount: /tmp/ris_install:/tmp/ris_install
- extra-options: SYS_PTRACE
# C3
- container:
- name: "c3"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
- network:
- process-network
# - field-network_r3_c3
- ip: 13.0.0.30 # manually assign an ip address
- cpus: 4
- memory: 2048
- extra-options: SYS_PTRACE
# C4
- container:
- name: "c4"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
- network:
- control-network_c4_s4
# - field-network_r4_c4
- cpus: 4
- memory: 2048
# C^5
- container:
- name: "c5"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
- network:
- control-network_c5_s5
# - field-network_r5_c5
- cpus: 4
- memory: 2048
- mount: /tmp/ris_install:/tmp/ris_install
- extra-options: SYS_PTRACE
# C^6
- container:
- name: "c6"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/robo_ur_cb3_1:3.13.0
- network:
- process-network
# - field-network_r6_c6
- cpus: 4
- memory: 2048
- mount: /tmp/ris_install:/tmp/ris_install
- extra-options: SYS_PTRACE
#
# Control stations
#
# S1
- container:
- name: "s1"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- control-network_c1_s1
- process-network
- ip:
- 12.0.0.50 # ip for control-network_c1_s1
- 13.0.0.5 # ip in process-network
- cpus: 4
- memory: 4096
- extra-options: NET_ADMIN
# S^2
- container:
- name: "s2"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario-hardened
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- control-network_c2_s2
- process-network
- ip:
- 12.0.2.50 # ip for control-network_c2_s2
# - 13.0.0.6 # ip for process-network
- cpus: 4
- memory: 4096
- extra-options: NET_ADMIN
# S^4
- container:
- name: "s4"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario-hardened
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- control-network_c4_s4
- process-network
- ip: 12.0.4.50 # ip for control-network_c4_s4
- cpus: 4
- memory: 4096
- extra-options: NET_ADMIN
# S5
- container:
- name: "s5"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- control-network_c5_s5
- process-network
- ip: 12.0.5.50 # ip for control-network_c5_s5
- cpus: 4
- memory: 4096
# S7
- container:
- name: "s7"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- dmz1
- process-network
- ip:
- 16.0.0.20 # ip in dmz1
- 13.0.0.20 # ip in process-network
- cpus: 4
- memory: 4096
- extra-options: NET_ADMIN
#
# Development stations
#
# D1
- container:
- name: "d1"
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros_ur:melodic-official-scenario
- network:
- it-network
- dmz1
- cloud-network
# - process-network # bypass firewall restrictions by connecting directly
- ip:
- 15.0.0.30 # ip in IT
- 16.0.0.30 # ip in dmz1
- 17.0.0.30 # ip in cloud
# - 13.0.0.9
- cpus: 4
- memory: 4096
- extra-options: NET_ADMIN
#
# Attackers
#
- container:
- name: attacker_cloud
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/alurity:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/expl_robosploit/expl_robosploit:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/reco_nmap:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/reco_binwalk:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/expl_icssploit:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/expl_rospento:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/expl_rosploit:latest
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/expl_metasploit:latest
- network:
# - it-network
- cloud-network
- extra-options: ALL
- container:
- name: attacker_dmz1
- modules:
# - base: registry.gitlab.com/aliasrobotics/offensive/alurity/alurity:latest
- base: registry.gitlab.com/aliasrobotics/offensive/alurity/comp_ros:melodic-scenario
- volume: registry.gitlab.com/aliasrobotics/offensive/alurity/reco_nmap:latest
- network:
- dmz1
- process-network
- extra-options: ALL
#
# extra elements
#
# connector of
# - it-network
# - dmz2
# - dmz1
- container:
- name: firewall-it-dmz1
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/projects/rosin-redros-i:firewall-three-net
- network:
- it-network
- dmz2
- dmz1
- extra-options: NET_ADMIN
- ip:
- 15.0.0.254
- 14.0.0.254
- 16.0.0.254
# DMZ machine
- container:
- name: dmz-server
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/projects/rosin-redros-i:dmz
- network: dmz2
- extra-options: NET_ADMIN
- ip: 14.0.0.20
# Connector of process-network and dmz2
- container:
- name: firewall-process-dmz2
- modules:
- base: registry.gitlab.com/aliasrobotics/offensive/projects/rosin-redros-i:firewall-two
- network:
- dmz2
- process-network
- extra-options: NET_ADMIN
- ip:
- 14.0.0.253
- 13.0.0.254
In an attempt to bring awareness, transparency and fight against the current trend of security-by-obscurity, most of our tools have been open sourced at https://github.com/aliasrobotics. Results have also been cataloged at the Robot Vulnerability Database. We encourage roboticists and security researchers to dive into the material generated and help triage remaining flaws.
For more, refer to the Red teaming ROS-Industrial extended report (white paper)
(56 pages).