Skip to content

Fix android shmem #3229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed

Conversation

Evian-Zhang
Copy link
Contributor

Description

Fix #3225.

Ideally, we should reuse the shmem module in libafl_bolts. However, we could not get shared memory size properly (as far as I know) for all target architecture.

Checklist

  • I have run ./scripts/precommit.sh and addressed all comments

@domenukk
Copy link
Member

impl AshmemShMem {

Did you see that we have an AshMemShMem we could probably use?
In General the forkserver should use our ShMemProvider infrastructure I think, it's the right way

@domenukk
Copy link
Member

Ah nevermind just saw your description :D
Can we.. fix the provider somehow?

@s1341
Copy link
Collaborator

s1341 commented May 15, 2025

yeah. I'm with @domenukk. Let's fix the providers and use them. The duplication is painful.

@domenukk
Copy link
Member

However, we could not get shared memory size properly (as far as I know) for all target architecture.

Why do you even need the size of the map for forkserver? It's passed around in env variables IIRC

@Evian-Zhang
Copy link
Contributor Author

Evian-Zhang commented May 15, 2025

@domenukk Yes the size of map is indeed useless in forkserver. However, the API of libafl_bolt's shmem need a proper size.

And sadly, not all maps' size are passed in env. For example, the size of shared input is nowhere to find (if I understand correctly).

@domenukk
Copy link
Member

I mean we can just add an extra env if we need to, here (and in libafl):
https://github.com/AFLplusplus/AFLplusplus/blob/875c3902f057a53485341ec6b32e83c54c923292/src/afl-fuzz-init.c#L2918

@@ -86,6 +91,30 @@ fn read_u32_from_forkserver() -> Result<u32, Error> {
Ok(u32::from_ne_bytes(buf))
}

#[cfg(target_os = "android")]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these guys has nothing to do with forkserver. so i think it should go into libafl_bolts

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, and this is exactly what the above discussions are about: Shall we reuse the logic in libafl_bolt's shmem, and how?🤔 Since we cannot get size properly, it is not a trivial modification.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's reuse the logic, add an env to the forkserver in libafl and aflpp, if the env is not set, default to the default of MAX_FILE + sizeof(u32) (see link above)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, make sense. However, I am a bit busy til this weekend. Maybe handle this next week :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's just make that page-aligned MAX_FILE instead of adding 4 bytes

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nah that's a bad idea for the future

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inputs might be larger, and everything will have 1 meg hard coded

I mean that's how it is today but it's also bad

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for that part i don't have strong opinion. what i think is bad is that you are trying to mmap for a non-page aligned size.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think it matters, it's just an extra entry in the page table
The kernel aligns it internally anyway

@domenukk
Copy link
Member

domenukk commented May 15, 2025

Opened AFLplusplus/AFLplusplus#2430 and #3235

That being said, as @tokatoka said for now we can assume a fixed length / fallback to a fixed length

@domenukk
Copy link
Member

Merged the env into aflpp and LibAFL, think we can get by without knowing the map size now :)

@Evian-Zhang
Copy link
Contributor Author

Nice. I will update this PR next week.

@Evian-Zhang
Copy link
Contributor Author

Superseded by #3249

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Forkserver does not work on Android
4 participants