ChainSafe / ChainSafe/gossamer
Fuzzing result for MultiaddrFromStr Target
- Dominant language
- Go
- Stars
- 454
- Forks
- 144
- PR merge metrics
- No merged PRs in 30d
Description
# Target
### ```Substrate```
```multiaddr = { version = "0.14.0" }```
```rust
fn from_str(input: &str) -> Result {
let mut writer = Vec::new();
let mut parts = input.split('/').peekable();
if Some("") != parts.next() {
// A multiaddr must start with `/`
return Err(Error::InvalidMultiaddr);
}
while parts.peek().is_some() {
let p = Protocol::from_str_parts(&mut parts)?;
p.write_bytes(&mut writer)
.expect("Writing to a `Vec` never fails.");
}
Ok(Multiaddr {
bytes: Arc::new(writer),
})
}
```
### ```Smoldot```
```rust
fn from_str(input: &str) -> Result {
let mut bytes = Vec::with_capacity(input.len());
let mut parts = input.split('/').peekable();
if parts.next() != Some("") {
return Err(ParseError::InvalidMultiaddr);
}
while parts.peek().is_some() {
let protocol = ProtocolRef::from_str_parts(&mut parts)?;
for slice in protocol.as_bytes() {
bytes.extend_from_slice(slice.as_ref());
}
}
Ok(Multiaddr { bytes })
}
```
### ```Gossamer```
```go
func NewMultiaddr(s string) (a Multiaddr, err error) {
defer func() {
if e := recover(); e != nil {
log.Printf("Panic in NewMultiaddr on input %q: %s", s, e)
err = fmt.Errorf("%v", e)
}
}()
b, err := stringToBytes(s)
if err != nil {
return nil, err
}
return &multiaddr{bytes: b}, nil
}
```
# ```MultiaddrFromStr``` Reproducing Scripts
### ```Substrate```
```rust
pub fn substrate_multiaddr_from_str(file_name: &String) {
println!("[+] Substrate Result:");
let buf = read_bytes(file_name).unwrap();
let buf_str = String::from_utf8_lossy(&buf);
let vec: Vec<&str> = buf_str.split("\n").collect();
let ret = multiaddr::Multiaddr::from_str(vec[0]);
if let Err(_) = ret {
println!("[-] Multiaddr from_str result: {:?}", ret);
} else {
println!("[+] Multiaddr from_str result: {:?}", ret);
}
}
```
### ```Smoldot```
```rust
pub fn smoldot_multiaddr_from_str(file_name: &String) {
println!("[+] Smoldot Result:");
let buf = read_bytes(file_name).unwrap();
let buf_str = String::from_utf8_lossy(&buf);
let vec: Vec<&str> = buf_str.split("\n").collect();
let ret = smoldot::libp2p::multiaddr::Multiaddr::from_str(vec[0]);
if let Err(_) = ret {
println!("[-] Multiaddr from_str result: {:?}", ret);
} else {
println!("[+] Multiaddr from_str result: {:?}", ret);
}
}
```
### ```Gossamer```
```go
func glib_multiaddr_from_str(data_ptr unsafe.Pointer, data_size int) {
fmt.Println("[+] Gossamer Result:")
var data []byte
sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
sh.Data = uintptr(data_ptr)
sh.Len = data_size
sh.Cap = data_size
data_str := strings.Split(string(data[:]), "\n")
ret, err := ma.NewMultiaddr(data_str[0])
if err != nil {
fmt.Println("[-] Multiaddr ma.NewMultiaddr result:", err)
} else {
fmt.Println("[+] Multiaddr ma.NewMultiaddr result:", ret)
}
}
```
# Crash 1
The differential fuzzer catches a crash. The ```Gossamer``` target gives an error message but The ```Substrate``` and ```Smoldot``` targets execute the given data successfully.
### ```Reproducer``` crash report
```
./reproducer run all MultiaddrFromStr /crash-adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
[+] Smoldot Result:
[+] Multiaddr from_str result: Ok()
[+] Substrate Result:
[+] Multiaddr from_str result: Ok("")
[+] Gossamer Result:
[-] Multiaddr ma.NewMultiaddr result: failed to parse multiaddr "": empty multiaddr
```
### Artifacts 1
[multiaddrfromstr_crash1.zip](https://github.com/ChainSafe/gossamer/files/10723982/multiaddrfromstr_crash1.zip)
# Crash 2
The differential fuzzer catches a crash. The ```Smoldot``` and ```Substrate``` targets give an error message but The ```Gossamer``` target executes the given data successfully.
### ```Reproducer``` crash report
```
./reproducer run all MultiaddrFromStr /ccdc858574439606
[+] Smoldot Result:
[-] Multiaddr from_str result: Err(UnrecognizedProtocol)
[+] Substrate Result:
[-] Multiaddr from_str result: Err(UnknownProtocolString(""))
[+] Gossamer Result:
[+] Multiaddr ma.NewMultiaddr result: /p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tps/p2p/1tpc
```
### Artifacts 2
[multiaddrfromstr_crash2.zip](https://github.com/ChainSafe/gossamer/files/10723983/multiaddrfromstr_crash2.zip)
Contributor guide
Assessment
This issue has not been assessed yet.