On Thu, Sep 17, 2020 at 06:51:51PM +0200, Stefan Hagen wrote:
> Sebastien Marie wrote:
> > The following diff is a backport of
> > https://github.com/luakit/luakit/commit/4b22c18d5eb5594136091b7b615dc8f9ded0e32f
> > commit in order to avoid using rm(1) process to remove a file, but use
> > os.remove() lua function.
> > 
> > It permits to me to remove a spawn call whereas I am looking to
> > properly unveil(2) luakit process.
> > 
> > Comments or OK ?
> 
> Looks good. OK from my side.
> Do you have an unveiled version already?
 
yes :-)

I am using/experimenting with the following (see attached files):

- unveil.lua : it unveils the luakit process.
  currently, it is mostly used for removing execve(2) capability.
  
- unveil_wm.lua : it unveils the WebKitProcess (content process)
  the filesystem is readonly except drm devices and /tmp

  with lariza (another webkit based browser), WebKitProcess needs to
  execve(2) "lpr" to print. here, I don't have test it for now so it
  is still commented.

- openbsd.c : lua module for unveil(2) (and pledge(2)) binding


And finally my ~/.config/luakit/userconf.lua contains:

        -- unveil luakit+WebKitProcess
        require "unveil"


$ ps ux | grep -E '(luakit|WebKit)'
semarie  72835  0.0  0.3 80848 98032 ??  SU      1:45PM    0:05.09 luakit
semarie  19656  0.0  0.2 60880 54764 ??  I       1:45PM    0:01.20 
/usr/local/libexec/webkit2gtk-4.0/WebKitNetworkProcess 3 17 (WebKitNetworkPro)
semarie  95077  0.0  0.5 88148 142776 ??  SU      1:45PM    0:04.81 
/usr/local/libexec/webkit2gtk-4.0/WebKitWebProcess 11 24
semarie  82971  0.0  0.3 76284 99312 ??  SU      1:47PM    0:03.12 
/usr/local/libexec/webkit2gtk-4.0/WebKitWebProcess 18 34

So, on the three process types used, only the WebKitNetworkProcess
isn't unveiled. But I am unsure if it supports plugins and so if I can
inject unveil(2) or pledge(2). Something to see later.

With the attached code, it should be also possible to play with
pledge(2). But I need a working browser first (I am on the way to
reimplement few plugins I am using with firefox).

Thanks.
-- 
Sebastien Marie
--- unveil.lua

-- ask loading unveil_wm.lua inside WebKitProcess
local wm = require_web_module("unveil_wm")

-- local extension for pledge(2) + unveil(2)
package.cpath = package.cpath .. ';/home/semarie/repos/lua-openbsd/openbsd.so'
local openbsd = require("openbsd")

-- in luakit process
print("unveil: luakit")
if openbsd.unveil("/", "rwc") ~= 0 or
   openbsd.unveil("/usr/local/bin/luakit", "x") ~= 0 or
   openbsd.unveil("/usr/local/libexec/webkit2gtk-4.0", "x") ~= 0 or
   openbsd.unveil() ~= 0 
then
    print("unveil: oops unveil.lua (luakit)")
end
/*
 * Copyright (c) 2018 Sebastien Marie <sema...@online.fr>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * to compile:
 * cc -Wall -shared -o openbsd.so $(pkg-config --cflags --libs luaXX)
 */

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

#include <errno.h>
#include <unistd.h>

static int ipledge(lua_State *L);
static int iunveil(lua_State *L);

/**
 * Register functions
 */
int
luaopen_openbsd(lua_State *L)
{
        lua_newtable(L);
        lua_pushcfunction(L, &ipledge);
        lua_setfield(L, -2, "pledge");

        lua_pushcfunction(L, &iunveil);
        lua_setfield(L, -2, "unveil");
        
        return 1;
}

static int
ipledge(lua_State *L)
{
        int n = lua_gettop(L);  /* number of arguments */
        const char *promises = NULL;
        const char *execpromises = NULL;
        int ret;

        /* check arguments */
        if ((n > 2) ||
            ! (lua_isstring(L, 1) || lua_isnoneornil(L, 1)) ||
            ! (lua_isstring(L, 2) || lua_isnoneornil(L, 2))) {
                lua_pushliteral(L, "incorrect argument");
                lua_error(L);   
        }

        /* get arguments */
        if (lua_isstring(L, 1))
                promises = lua_tostring(L, 1);
        if (lua_isstring(L, 2))
                execpromises = lua_tostring(L, 2);

        /* call pledge(2) */
        ret = pledge(promises, execpromises);

        if (ret != 0)
                lua_pushnumber(L, errno);
        else
                lua_pushnumber(L, 0);

        return 1;
}

static int
iunveil(lua_State *L)
{
        int n = lua_gettop(L);  /* number of arguments */
        const char *path;
        const char *perm;
        int ret;

        /* check arguments */
        if (n == 0) {
                path = NULL;
                perm = NULL;
                
        } else if (n == 2) {
                if (! lua_isstring(L, 1) ||
                    ! lua_isstring(L, 2)) {
                        lua_pushliteral(L, "incorrect argument type");
                        lua_error(L);
                }
                
                /* get arguments */
                path = lua_tostring(L, 1);
                perm = lua_tostring(L, 2);

        } else {
                lua_pushliteral(L, "incorrect argument number");
                lua_error(L);
        }

        /* call unveil(2) */
        ret = unveil(path, perm);

        if (ret != 0)
                lua_pushnumber(L, errno);
        else
                lua_pushnumber(L, 0);

        return 1;
}
--- unveil_wm.lua

local ui = ipc_channel("unveil_wm")

--- local extension for pledge(2) + unveil(2)
package.cpath = package.cpath .. ';/home/semarie/repos/lua-openbsd/openbsd.so'
local openbsd = require("openbsd")

-- in WebKitProcess
print("unveil: WebKitProcess")
if openbsd.unveil("/", "r") ~= 0 or
   openbsd.unveil("/dev/drm0", "rw") ~= 0 or
   openbsd.unveil("/dev/drmR128", "rw") ~= 0 or
   openbsd.unveil("/tmp", "rwc") ~= 0 or
   openbsd.unveil("/home", "") ~= 0 or
   --openbsd.unveil("/usr/bin/lpr", "x") ~= 0 or
   openbsd.unveil() ~= 0
then
    print("unveil: oops unveil_wm.lua (WebKitProcess)")
end

Reply via email to