On Mon, 2021-03-15 at 12:14 -0500, Qing Zhao via Gcc-patches wrote:
> (CC’ing gcc-patch alias).
> 
> Hi, Kees,
> 
> 
> > On Mar 12, 2021, at 3:55 PM, Kees Cook <keesc...@chromium.org> wrote:
> > 
> > On Fri, Mar 12, 2021 at 03:35:28PM -0600, Qing Zhao wrote:
> > > Hi, Kees,
> > > 
> > > I am looking at the structure padding initialization issue. And
> > > also have some questions:
> > > 
> > > 
> > > > On Feb 24, 2021, at 10:41 PM, Kees Cook <keesc...@chromium.org>
> > > > wrote:
> > > > 
> > > > It looks like there is still some issues with padding and pre-
> > > > case
> > > > switch variables. Here's the test output, FWIW:
> > > > 
> > > > 
> > > > test_stackinit: small_hole_static_all FAIL (uninit bytes: 3)
> > > > test_stackinit: big_hole_static_all FAIL (uninit bytes: 61)
> > > > test_stackinit: trailing_hole_static_all FAIL (uninit bytes: 7)
> > > > test_stackinit: small_hole_dynamic_all FAIL (uninit bytes: 3)
> > > > test_stackinit: big_hole_dynamic_all FAIL (uninit bytes: 61)
> > > > test_stackinit: trailing_hole_dynamic_all FAIL (uninit bytes: 7)
> > > > 
> > > > test_stackinit: switch_1_none FAIL (uninit bytes: 8)
> > > > test_stackinit: switch_2_none FAIL (uninit bytes: 8)
> > > > test_stackinit: failures: 8
> > > > 
> > > > 
> > > > /* Simple structure with padding likely to be covered by
> > > > compiler. */
> > > > struct test_small_hole {
> > > >         size_t one;
> > > >         char two;
> > > >         /* 3 byte padding hole here. */
> > > >         int three;
> > > >         unsigned long four;
> > > > };
> > > > 
> > > > /* Try to trigger unhandled padding in a structure. */
> > > > struct test_aligned {
> > > >         u32 internal1;
> > > >         u64 internal2;
> > > > } __aligned(64);
> > > > 
> > > > struct test_big_hole {
> > > >         u8 one;
> > > >         u8 two;
> > > >         u8 three;
> > > >         /* 61 byte padding hole here. */
> > > >         struct test_aligned four;
> > > > } __aligned(64);
> > > > 
> > > > struct test_trailing_hole {
> > > >         char *one;
> > > >         char *two;
> > > >         char *three;
> > > >         char four;
> > > >         /* "sizeof(unsigned long) - 1" byte padding hole here. */
> > > > };
> > > > 
> > > > They fail when they're statically initialized (either fully or
> > > > partially),
> > > 
> > > So, when the structure is not statically initialized,  the compiler
> > > initialization is good?
> > > 
> > > For the failing cases, what’s the behavior of the LLVM -ftrivial-
> > > auto-var-init?
> > > 
> > > From the LLVM patch: 
> > > (https://reviews.llvm.org/D54604 <https://reviews.llvm.org/D54604>)
> > > 
> > > ====
> > > To keep the patch simple, only some undef is removed for now, see
> > > replaceUndef. The padding-related infoleaks are therefore not all
> > > gone yet.
> > > This will be addressed in a follow-up, mainly because addressing
> > > padding-related
> > > leaks should be a stand-alone option which is implied by variable
> > > initialization.
> > > ====
> > 
> > Right, padding init happened in:
> > https://github.com/llvm/llvm-project/commit/4f7bc0eee7e6099b1abd57dac3c83529944ab23c
> > 
> > And was further clarified that, IIUC, padding _must be zero_
> > regardless
> > of pattern-vs-zero in:
> > https://github.com/llvm/llvm-project/commit/d39fbc7e20d84364e409ce59724ce20625637062
> 
> Thanks a lot for the above information, they are very useful.
> I will take a look at the LLVM patch and try to implement this feature
> into GCC as well.
> 
> > 
> > > Yes, in GCC’s implementation, I think that  fixing all padding-
> > > related leaks also require a
> > > separate patch.
> > 
> > That's fine -- but it'll need to be tied to -ftrivial-auto-var-init,
> > since otherwise the memory isn't actually fully initialized. :)
> 
> Okay, will do that.
> 
> Thanks again.
> 
> Qing
> 

Did this patch get reviewed/approved?

Is the latest version still this one:
  https://gcc.gnu.org/pipermail/gcc-patches/2021-February/565581.html
or is there a more recent version that should be reviewed?

(I don't think I'm qualified to approve the patch, I'm just a fan of
the approach.  FWIW I've been experimenting with extending -fanalyzer
to detect infoleaks in the kernel, whereas AIUI this patch is about
mitigating them)

Hope this is constructive
Dave

Reply via email to