By Reid Wightman @ReverseICS
My last project before joining IOActive was “breaking” 3S Software’s CoDeSys PLC runtime for Digital Bond.
The PLC runtime is pretty cool, from a
hacker perspective. CoDeSys is an unusual ladder logic runtime for a number of
reasons.
Different vendors have different
strategies for executing ladder logic. Some run ladder logic on custom
ASICs (or possibly interpreter/emulators) on their PLC processor, while others
execute ladder logic as native code. For an introduction to reverse-engineering
the interpreted code and ASIC code, check out FX’s talk on Decoding Stuxnet at C3. It really
is amazing, and FX has a level of patience in disassembling code for an unknown
CPU that I think is completely unique.
CoDeSys is interesting to me because
it doesn’t work like the Siemens ladder logic. CoDeSys compiles your ladder
logic as byte code for the processor on which the ladder logic is running. On
our Wago system, it was an x86 processor, and the ladder logic was compiled x86
code. A CoDeSys ladder logic file is literally loaded into memory, and then
execution of the runtime jumps into the ladder logic file. This is great because we can easily disassemble a ladder logic file, or
better, build our own file that executes system calls.
I talked about this oddity at AppSec
DC in April 2012. All CoDeSys installations seem to fall into three categories:
the runtime is executing on top of an embedded OS, which lacks code privilege
separation; the runtime is executing on Linux with a uid of 0; or the runtime
is executing on top of Windows CE in single user mode. All three are bad for the
same reasons.
All three mean of course that an
unauthenticated user can upload an executable file to the PLC, and it will be
executed with no protection. On Windows and Linux hosts, it is worse because
the APIs to commit Evil are well understood.
3S has published an advisory on
setting passwords for CoDeSys as the solution to the ladder logic upload
problem. Unfortunately, the password is useless unless the vendors (the PLC
manufacturers who run CoDeSys on their PLC) make extensive modification to the
runtime source code.
Setting a password on CoDeSys protects
code segments. In theory, this can prevent a user from uploading a new ladder
logic program without knowing the password. Unfortunately, the shell protocol
used by 3S has a command called delpwd,
which deletes the password and does not require authentication. Further, even
if that little problem was fixed, we still get arbitrary file upload and
download with the privileges of the process (remember the note about
administrator/root?). So as a bad guy, I could just upload a new binary, upload
a new copy of the crontab file, and wait patiently for the process to execute.
The solution that I would like to see
in future CoDeSys releases would include a requirement for authentication prior
to file upload, a patch for the directory traversal vulnerability, and added
cryptographic security to the protocol to prevent man-in-the-middle and replay
attacks.
No comments:
Post a Comment