]> xenbits.xensource.com Git - xen.git/commitdiff
tools/libfsimage: Export a new function to preload all plugins
authorAlejandro Vallejo <alejandro.vallejo@cloud.com>
Mon, 25 Sep 2023 17:32:24 +0000 (18:32 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 27 Sep 2023 15:30:18 +0000 (16:30 +0100)
This is work required in order to let pygrub operate in highly deprivileged
chroot mode. This patch adds a function that preloads every plugin, hence
ensuring that a on function exit, every shared library is loaded in memory.

The new "init" function is supposed to be used before depriv, but that's
fine because it's not acting on untrusted data.

This is part of XSA-443 / CVE-2023-34325

Signed-off-by: Alejandro Vallejo <alejandro.vallejo@cloud.com>
(cherry picked from commit 990e65c3ad9ac08642ce62a92852c80be6c83e96)

tools/libfsimage/common/fsimage_plugin.c
tools/libfsimage/common/mapfile-GNU
tools/libfsimage/common/mapfile-SunOS
tools/libfsimage/common/xenfsimage.h
tools/pygrub/src/fsimage/fsimage.c

index de1412b4233ab112cf9100ab41178b110c46d48c..d0cb9e96a6547f34116bb92f74c9b63ccb66bd4d 100644 (file)
@@ -119,7 +119,7 @@ fail:
        return (-1);
 }
 
-static int load_plugins(void)
+int fsi_init(void)
 {
        const char *fsdir = getenv("XEN_FSIMAGE_FSDIR");
        struct dirent *dp = NULL;
@@ -180,7 +180,7 @@ int find_plugin(fsi_t *fsi, const char *path, const char *options)
        fsi_plugin_t *fp;
        int ret = 0;
 
-       if (plugins == NULL && (ret = load_plugins()) != 0)
+       if (plugins == NULL && (ret = fsi_init()) != 0)
                goto out;
 
        for (fp = plugins; fp != NULL; fp = fp->fp_next) {
index 26d4d7a69ec7bbd0f7f5e48c61ea7eb61c32a2f6..2d54d527d7f52fc72e90e764ce90f7049524e1c6 100644 (file)
@@ -1,6 +1,7 @@
 VERSION {
        libfsimage.so.1.0 {
                global:
+                       fsi_init;
                        fsi_open_fsimage;
                        fsi_close_fsimage;
                        fsi_file_exists;
index e99b90b65077f9e0e6082e7d2d1fa5aa55e3af7b..48deedb4252f6a886afcb73b03c7b7d8e4134d71 100644 (file)
@@ -1,5 +1,6 @@
 libfsimage.so.1.0 {
        global:
+               fsi_init;
                fsi_open_fsimage;
                fsi_close_fsimage;
                fsi_file_exists;
index 201abd54f23a65ac9fae3a7b56ddb43866980df8..341883b2d71a580ba57868ed6ae095df88f33acd 100644 (file)
@@ -35,6 +35,14 @@ extern C {
 typedef struct fsi fsi_t;
 typedef struct fsi_file fsi_file_t;
 
+/*
+ * Optional initialization function. If invoked it loads the associated
+ * dynamic libraries for the backends ahead of time. This is required if
+ * the library is to run as part of a highly deprivileged executable, as
+ * the libraries may not be reachable after depriv.
+ */
+int fsi_init(void);
+
 fsi_t *fsi_open_fsimage(const char *, uint64_t, const char *);
 void fsi_close_fsimage(fsi_t *);
 
index 2ebbbe35df92cc1cd63d7619658e0fd2fb5c343c..92fbf2851f016715e8f5a1afcc9ae238cb96c096 100644 (file)
@@ -286,6 +286,15 @@ fsimage_getbootstring(PyObject *o, PyObject *args)
        return Py_BuildValue("s", bootstring);
 }
 
+static PyObject *
+fsimage_init(PyObject *o, PyObject *args)
+{
+       if (!PyArg_ParseTuple(args, ""))
+               return (NULL);
+
+       return Py_BuildValue("i", fsi_init());
+}
+
 PyDoc_STRVAR(fsimage_open__doc__,
     "open(name, [offset=off]) - Open the given file as a filesystem image.\n"
     "\n"
@@ -297,7 +306,13 @@ PyDoc_STRVAR(fsimage_getbootstring__doc__,
     "getbootstring(fs) - Return the boot string needed for this file system "
     "or NULL if none is needed.\n");
 
+PyDoc_STRVAR(fsimage_init__doc__,
+    "init() - Loads every dynamic library contained in xenfsimage "
+    "into memory so that it can be used in chrooted environments.\n");
+
 static struct PyMethodDef fsimage_module_methods[] = {
+       { "init", (PyCFunction)fsimage_init,
+           METH_VARARGS, fsimage_init__doc__ },
        { "open", (PyCFunction)fsimage_open,
            METH_VARARGS|METH_KEYWORDS, fsimage_open__doc__ },
        { "getbootstring", (PyCFunction)fsimage_getbootstring,