2018-11-23 11:46:59

by Pan Bian

[permalink] [raw]
Subject: [PATCH] f2fs: read page index before freeing

The function truncate_node frees the page with f2fs_put_page. However,
the page index is read after that. So, the patch reads the index before
freeing the page.

Signed-off-by: Pan Bian <[email protected]>
---
fs/f2fs/node.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index d338740..88be946 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -826,6 +826,7 @@ static int truncate_node(struct dnode_of_data *dn)
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct node_info ni;
int err;
+ pgoff_t index;

err = f2fs_get_node_info(sbi, dn->nid, &ni);
if (err)
@@ -845,10 +846,11 @@ static int truncate_node(struct dnode_of_data *dn)
clear_node_page_dirty(dn->node_page);
set_sbi_flag(sbi, SBI_IS_DIRTY);

+ index = dn->node_page->index;
f2fs_put_page(dn->node_page, 1);

invalidate_mapping_pages(NODE_MAPPING(sbi),
- dn->node_page->index, dn->node_page->index);
+ index, index);

dn->node_page = NULL;
trace_f2fs_truncate_node(dn->inode, dn->nid, ni.blk_addr);
--
2.7.4




2018-11-23 12:24:03

by Chao Yu

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

Hi Pan,

On 2018/11/22 18:58, Pan Bian wrote:
> The function truncate_node frees the page with f2fs_put_page. However,
> the page index is read after that. So, the patch reads the index before
> freeing the page.

Good catch!

It will be better to add:

Fixes: bf39c00a9a7f ("f2fs: drop obsolete node page when it is truncated")
Cc: <[email protected]>

>
> Signed-off-by: Pan Bian <[email protected]>

Reviewed-by: Chao Yu <[email protected]>

Thanks,


2018-11-23 15:22:17

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On 11/22, Chao Yu wrote:
> Hi Pan,
>
> On 2018/11/22 18:58, Pan Bian wrote:
> > The function truncate_node frees the page with f2fs_put_page. However,
> > the page index is read after that. So, the patch reads the index before
> > freeing the page.
>
> Good catch!

+1

>
> It will be better to add:
>
> Fixes: bf39c00a9a7f ("f2fs: drop obsolete node page when it is truncated")
> Cc: <[email protected]>
>
> >
> > Signed-off-by: Pan Bian <[email protected]>
>
> Reviewed-by: Chao Yu <[email protected]>

Done.

>
> Thanks,

2018-11-26 09:14:57

by Chao Yu

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

Hi Pan,

On 2018/11/22 18:58, Pan Bian wrote:
> The function truncate_node frees the page with f2fs_put_page. However,
> the page index is read after that. So, the patch reads the index before
> freeing the page.

I notice that you found another use-after-free bug in ext4, out of
curiosity, I'd like to ask how do you find those bugs? by tool or code review?

Thanks,


2018-11-26 10:30:08

by Pan Bian

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On Mon, Nov 26, 2018 at 05:13:53PM +0800, Chao Yu wrote:
> Hi Pan,
>
> On 2018/11/22 18:58, Pan Bian wrote:
> > The function truncate_node frees the page with f2fs_put_page. However,
> > the page index is read after that. So, the patch reads the index before
> > freeing the page.
>
> I notice that you found another use-after-free bug in ext4, out of
> curiosity, I'd like to ask how do you find those bugs? by tool or code review?

I found such bugs by the aid of a tool I wrote recently. I designed a method
to automatically find paired alloc/free functions. With such functions, I
wrote two checkers, one to check mismatched alloc/free bugs, the other to
check use-after-free and double-free bugs.

Best regards,
Pan Bian


2018-11-26 11:09:34

by Chao Yu

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On 2018/11/26 18:28, PanBian wrote:
> On Mon, Nov 26, 2018 at 05:13:53PM +0800, Chao Yu wrote:
>> Hi Pan,
>>
>> On 2018/11/22 18:58, Pan Bian wrote:
>>> The function truncate_node frees the page with f2fs_put_page. However,
>>> the page index is read after that. So, the patch reads the index before
>>> freeing the page.
>>
>> I notice that you found another use-after-free bug in ext4, out of
>> curiosity, I'd like to ask how do you find those bugs? by tool or code review?
>
> I found such bugs by the aid of a tool I wrote recently. I designed a method
> to automatically find paired alloc/free functions. With such functions, I
> wrote two checkers, one to check mismatched alloc/free bugs, the other to
> check use-after-free and double-free bugs.

Excellent! Do you have any plan to open its source or announce it w/ binary
to linux kernel developers, I think w/ it we can help to improve kernel's
code quality efficiently.

Thanks,

>
> Best regards,
> Pan Bian
>
>
> .
>


2018-11-27 00:23:54

by Pan Bian

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On Mon, Nov 26, 2018 at 07:07:08PM +0800, Chao Yu wrote:
> On 2018/11/26 18:28, PanBian wrote:
> > On Mon, Nov 26, 2018 at 05:13:53PM +0800, Chao Yu wrote:
> >> Hi Pan,
> >>
> >> On 2018/11/22 18:58, Pan Bian wrote:
> >>> The function truncate_node frees the page with f2fs_put_page. However,
> >>> the page index is read after that. So, the patch reads the index before
> >>> freeing the page.
> >>
> >> I notice that you found another use-after-free bug in ext4, out of
> >> curiosity, I'd like to ask how do you find those bugs? by tool or code review?
> >
> > I found such bugs by the aid of a tool I wrote recently. I designed a method
> > to automatically find paired alloc/free functions. With such functions, I
> > wrote two checkers, one to check mismatched alloc/free bugs, the other to
> > check use-after-free and double-free bugs.
>
> Excellent! Do you have any plan to open its source or announce it w/ binary
> to linux kernel developers, I think w/ it we can help to improve kernel's
> code quality efficiently.

Yes. I am now writing a paper about the method. I will open the source code
as soon as I complete the paper and some optimizations.

Best,
Pan


2018-11-27 03:15:02

by Chao Yu

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On 2018/11/27 8:22, PanBian wrote:
> On Mon, Nov 26, 2018 at 07:07:08PM +0800, Chao Yu wrote:
>> On 2018/11/26 18:28, PanBian wrote:
>>> On Mon, Nov 26, 2018 at 05:13:53PM +0800, Chao Yu wrote:
>>>> Hi Pan,
>>>>
>>>> On 2018/11/22 18:58, Pan Bian wrote:
>>>>> The function truncate_node frees the page with f2fs_put_page. However,
>>>>> the page index is read after that. So, the patch reads the index before
>>>>> freeing the page.
>>>>
>>>> I notice that you found another use-after-free bug in ext4, out of
>>>> curiosity, I'd like to ask how do you find those bugs? by tool or code review?
>>>
>>> I found such bugs by the aid of a tool I wrote recently. I designed a method
>>> to automatically find paired alloc/free functions. With such functions, I
>>> wrote two checkers, one to check mismatched alloc/free bugs, the other to
>>> check use-after-free and double-free bugs.
>>
>> Excellent! Do you have any plan to open its source or announce it w/ binary
>> to linux kernel developers, I think w/ it we can help to improve kernel's
>> code quality efficiently.
>
> Yes. I am now writing a paper about the method. I will open the source code
> as soon as I complete the paper and some optimizations.

Cool, if there is any progress, please let f2fs guys know, thank you in
advance. :)

Thanks,

>
> Best,
> Pan
>
>
> .
>


2018-11-27 03:43:20

by Pan Bian

[permalink] [raw]
Subject: Re: [PATCH] f2fs: read page index before freeing

On Tue, Nov 27, 2018 at 11:12:40AM +0800, Chao Yu wrote:
> On 2018/11/27 8:22, PanBian wrote:
> > On Mon, Nov 26, 2018 at 07:07:08PM +0800, Chao Yu wrote:
> >> On 2018/11/26 18:28, PanBian wrote:
> >>> On Mon, Nov 26, 2018 at 05:13:53PM +0800, Chao Yu wrote:
> >>>> Hi Pan,
> >>>>
> >>>> On 2018/11/22 18:58, Pan Bian wrote:
> >>>>> The function truncate_node frees the page with f2fs_put_page. However,
> >>>>> the page index is read after that. So, the patch reads the index before
> >>>>> freeing the page.
> >>>>
> >>>> I notice that you found another use-after-free bug in ext4, out of
> >>>> curiosity, I'd like to ask how do you find those bugs? by tool or code review?
> >>>
> >>> I found such bugs by the aid of a tool I wrote recently. I designed a method
> >>> to automatically find paired alloc/free functions. With such functions, I
> >>> wrote two checkers, one to check mismatched alloc/free bugs, the other to
> >>> check use-after-free and double-free bugs.
> >>
> >> Excellent! Do you have any plan to open its source or announce it w/ binary
> >> to linux kernel developers, I think w/ it we can help to improve kernel's
> >> code quality efficiently.
> >
> > Yes. I am now writing a paper about the method. I will open the source code
> > as soon as I complete the paper and some optimizations.
>
> Cool, if there is any progress, please let f2fs guys know, thank you in
> advance. :)

No problem. It's my honor to apply my tool to the Linux kernel.

>
> Thanks,
>