Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- RCEoR: a secure protocol for remote code execution over rednet (ComputerCraft)
- This is free and unencumbered software released into the public domain.
- Anyone is free to copy, modify, publish, use, compile, sell, or
- distribute this software, either in source code form or as a compiled
- binary, for any purpose, commercial or non-commercial, and by any
- means.
- In jurisdictions that recognize copyright laws, the author or authors
- of this software dedicate any and all copyright interest in the
- software to the public domain. We make this dedication for the benefit
- of the public at large and to the detriment of our heirs and
- successors. We intend this dedication to be an overt act of
- relinquishment in perpetuity of all present and future rights to this
- software under copyright law.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- For more information, please refer to <http://unlicense.org/>
- RCEoR v1.1
- Protocol: rednet protocol "rceor", messages of the format:
- {code = [code to run], evil = [evilness of code]}
- live is also accepted as an alias for evil.
- ]]
- local secureEnv = {
- print = print,
- http = http,
- rednet = rednet,
- textutils = textutils,
- bit = bit,
- pcall = pcall,
- colors = colors,
- gps = gps,
- pairs = pairs,
- ipairs = ipairs,
- math = math,
- _HOST = _HOST .. " (RCEoR Sandbox)",
- string = string
- }
- function clone(x)
- local ty = type(x)
- if ty == "table" then
- local new = {}
- for k, v in pairs(x) do
- new[k] = clone(v)
- end
- elseif ty == "function" then
- return function(...) return x(...) end
- else
- return x
- end
- end
- secureEnv.rednet.close = nil
- local argv = {...}
- local secure = true
- if argv[1] == "insecure" then
- secure = false
- end
- for _, n in pairs(peripheral.getNames()) do -- open modems
- if pcall(rednet.open, n) then
- print("Opened a modem")
- end
- end
- local coros = {}
- local function safeish_serialize(x)
- local ok, res = pcall(textutils.serialize, x)
- if ok then return res
- else return tostring(x) end
- end
- function run(code)
- print("Executing", code)
- if secure then
- local f = load(code, "@<RCEoR input>", "t", clone(secureEnv))
- if f then
- table.insert(coros, coroutine.create(function()
- local result = {pcall(f)}
- print(safeish_serialise(result))
- end))
- else
- print "Invalid code: EVIL?!!?!?!?!?!"
- end
- else
- print(safeish_serialise(loadstring(code)()))
- end
- end
- function receiver()
- while true do
- local sender, message = rednet.receive "rceor"
- if message and message.code then
- if secure then
- if message.evil or message.live then
- print "Evil message detected"
- else
- print "Running securely"
- run(message.code)
- end
- else
- print "Running"
- run(message.code)
- end
- end
- end
- end
- if not secure then receiver() end
- table.insert(coros, coroutine.create(receiver))
- while true do
- local ev = {os.pullEvent()}
- for k, c in pairs(coros) do
- if coroutine.status(c) == "dead" then coros[k] = nil end
- coroutine.resume(c, table.unpack(ev))
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement