tools/libfsimage: Export a new function to preload all plugins

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 990e65c3ad)
This commit is contained in:
Alejandro Vallejo authored and Andrew Cooper committed 2023-09-27 16:29:50 +01:00
1 parent d01f651da0
commit c1159b5ed4
5 files changed
+27 -2

No files matched your search

+2 -2
View 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) {
+1
View File
@@ -1,6 +1,7 @@
VERSION {
libfsimage.so.1.0 {
global:
fsi_init;
fsi_open_fsimage;
fsi_close_fsimage;
fsi_file_exists;
+1
View File
@@ -1,5 +1,6 @@
libfsimage.so.1.0 {
global:
fsi_init;
fsi_open_fsimage;
fsi_close_fsimage;
fsi_file_exists;
+8
View 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 *);
+15
View 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,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.