modifying ld.so to pre-process elf file, concurrency problem / SIGSEGV

Bill Ross rossbcan@gmail.com
Wed Nov 25 16:54:00 GMT 2015


Hi;

I am modifying ld.so to load a custom library to pre-process elf files based
on header flags, to perform elf segment hash verification


Exact Question: What is the proper way to invoke _dl_open() from within
ld.so such that internal ld.so structs are maintained / mutexed properly?

Eglibc 2.19, file rtld.c, x86_64

Line # 1546


      /* If we have any auditing modules, announce that we already
                have two objects loaded.  */
      if (__builtin_expect (GLRO(dl_naudit) > 0, 0))
                {
                  struct link_map *ls[2] = { main_map, &GL(dl_rtld_map) };

                  for (unsigned int outer = 0; outer < 2; ++outer)
                    {
                      struct audit_ifaces *afct = GLRO(dl_audit);
                      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit);
++cnt)
                                {
                                  if (afct->objopen != NULL)
                                    {
                                      ls[outer]->l_audit[cnt].bindflags
                                                = afct->objopen (ls[outer],
LM_ID_BASE,
                                                                            
    &ls[outer]->l_audit[cnt].cookie);

                                      ls[outer]->l_audit_any_plt
                                                |=
ls[outer]->l_audit[cnt].bindflags != 0;
                                    }

                                  afct = afct->next;
                                }
                    }
                }
    }
Added:    if ( ((ehdr->e_flags & VT_PROTECTED) == VT_PROTECTED) ||
((ehdr->e_flags & VT_HASHED) == VT_HASHED) ){
       struct link_map *protect_map = _dl_open("libprotect.so", (RTLD_LAZY |
__RTLD_DLOPEN | __RTLD_SECURE),
       dl_main, LM_ID_NEWLM, _dl_argc, INTUSE(_dl_argv), __environ);
   }




Approx line 2112:

  /* Save the information about the original global scope list since
     we need it in the memory handling later.  */
  GLRO(dl_initial_searchlist) = *GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist;

  /* Remember the last search directory added at startup, now that
     malloc will no longer be the one from dl-minimal.c.  */
  SIGSEGV here: GLRO(dl_init_all_dirs) = GL(dl_all_dirs);

A SIGSEGV occurs in the last line. Appears to be some sort of concurrency /
re-entrant problem with _dl_load if the header flags are present (load
library), else OK

The best a web search yielded is this, which I am unable to determine if is
applicable:
https://sourceware.org/ml/libc-help/2010-10/msg00024.html

And, the modified rtld.c file is available here:
www.rossco.org/Files/rtld.c

If anyone is interested in a joint debugging / screen sharing session,
contact me: rossbcan at gmail dot com

Thanks;
Bill Ross




More information about the Libc-help mailing list