On Wed, Jul 22, 2020 at 12:56:10PM -0700, Kristen Carlson Accardi wrote:
On Wed, 2020-07-22 at 12:42 -0700, Kees Cook wrote:
quoted
On Wed, Jul 22, 2020 at 11:07:30AM -0500, Josh Poimboeuf wrote:
quoted
On Wed, Jul 22, 2020 at 07:39:55AM -0700, Kees Cook wrote:
quoted
On Wed, Jul 22, 2020 at 11:27:30AM +0200, Miroslav Benes wrote:
quoted
Let me CC live-patching ML, because from a quick glance this is
something
which could impact live patching code. At least it invalidates
assumptions
which "sympos" is based on.
In a quick skim, it looks like the symbol resolution is using
kallsyms_on_each_symbol(), so I think this is safe? What's a good
selftest for live-patching?
The problem is duplicate symbols. If there are two static
functions
named 'foo' then livepatch needs a way to distinguish them.
Our current approach to that problem is "sympos". We rely on the
fact
that the second foo() always comes after the first one in the
symbol
list and kallsyms. So they're referred to as foo,1 and foo,2.
Ah. Fun. In that case, perhaps the LTO series has some solutions. I
think builds with LTO end up renaming duplicate symbols like that, so
it'll be back to being unique.
Well, glad to hear there might be some precendence for how to solve
this, as I wasn't able to think of something reasonable off the top of
my head. Are you speaking of the Clang LTO series?
https://lore.kernel.org/lkml/20200624203200.78870-1-samitolvanen@google.com/ (local)
I'm not sure how LTO does it, but a few more (half-brained) ideas that
could work:
1) Add a field in kallsyms to keep track of a symbol's original offset
before randomization/re-sorting. Livepatch could use that field to
determine the original sympos.
2) In fgkaslr code, go through all the sections and mark the ones which
have duplicates (i.e. same name). Then when shuffling the sections,
skip a shuffle if it involves a duplicate section. That way all the
duplicates would retain their original sympos.
3) Livepatch could uniquely identify symbols by some feature other than
sympos. For example:
Symbol/function size - obviously this would only work if duplicately
named symbols have different sizes.
Checksum - as part of a separate feature we're also looking at giving
each function its own checksum, calculated based on its instruction
opcodes. Though calculating checksums at runtime could be
complicated by IP-relative addressing.
I'm thinking #1 or #2 wouldn't be too bad. #3 might be harder.
--
Josh