[Bug 1881982] Re: memory exhaustion in parse_report()

2020-06-18 Thread Seong-Joong Kim
** Description changed:

  Hi,
  
  I have found a security issue on whoopsie 0.2.69 and earlier.
  
- ## Vulnerability in whoopsie
- - It was discovered that whoopsie incorrectly handled certain malformed crash 
files. If a user using whoopsie were tricked into parsing and uploading a 
specially crafted crash file, an attacker could exploit this to cause a denial 
of service. 
+ # Vulnerability description
+ The parse_report() function in whoopsie.c allows attackers to cause a denial 
of service (memory leak) via a crafted file. 
+ Exploitation of this issue causes excessive memory consumption which results 
in the Linux kernel triggering OOM killer on arbitrary process.
+ This results in the process being terminated by the OOM killer.
  
- ## Basic
- When a program has been crashed, Linux system tries to create a '.crash' file 
on '/var/crash/' directory with python script located in 
'/usr/share/apport/apport'.
- The file contains a series of system crash information including core dump, 
syslog, stack trace, memory map info, etc.
- A user is given read and write permission to the file.
- After then, whoopsie parses key-value pairs in ‘.crash’ file and encodes it 
into binary json (bson) format.
- Lastly, whoopsie forwards the data to a remotely connected Ubuntu error 
report system.
  
- ## Vulnerability
+ # Details 
  We have found a memory leak vulnerability during the parsing the crash file, 
when a collision occurs on GHashTable through g_hash_table_insert().
  According to [1], if the key already exists in the GHashTable, its current 
value is replaced with the new value.
  If 'key_destory_func' and 'value_destroy_func' are supplied when creating the 
table, the old value and the passed key are freed using that function.
  Unfortunately, whoopsie does not handle the old value and the passed key when 
collision happens.
  If a crash file contains same repetitive key-value pairs, it leads to memory 
leak as much as the amount of repetition and results in denial-of-service.
  
- ## Attack
+ [1] https://developer.gnome.org/glib/stable/glib-Hash-Tables.html#g
+ -hash-table-insert
+ 
+ 
+ # PoC (*Please check the below PoC: whoopsie_killer.py)
  1) Generates a certain malformed crash file that contains same repetitive 
key-value pairs.
  2) Trigger the whoopsie to read the generated crash file.
  3) After then, the whoopsie process has been killed.
  
- ## Mitigation
+ 
+ # Mitigation (*Please check the below patch: g_hash_table_memory_leak.patch)
  We should use g_hash_table_new_full() with ‘key_destroy_func’ and 
‘value_destroy_func’ functions instead of g_hash_table_new().
  Otherwise, before g_hash_table_insert(), we should check the collision via 
g_hash_table_lookup_extended() and obtain pointer to the old value and remove 
it.
  
  Sincerely,
- 
- [1] https://developer.gnome.org/glib/stable/glib-Hash-Tables.html#g
- -hash-table-insert

** Summary changed:

- memory exhaustion in parse_report()
+ DoS vulnerability: cause resource exhaustion

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1881982

Title:
  DoS vulnerability: cause resource exhaustion

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

[Bug 1881982] Re: memory exhaustion in parse_report()

2020-06-17 Thread Seong-Joong Kim
Exploitation of this issue causes excessive memory consumption which results in 
the Linux kernel triggering OOM killer on arbitrary process. 
This results in the process being terminated by the OOM killer.
Please check the following PoC: whoopsie_killer.py

** Attachment removed: "memory leak poc"
   
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+attachment/5380170/+files/memory_leak_poc.py

** Attachment added: "whoopsie_killer.py"
   
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+attachment/5384875/+files/whoopsie_killer.py

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1881982

Title:
  memory exhaustion in parse_report()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

[Bug 1881982] Re: memory exhaustion in parse_report()

2020-06-15 Thread Seong-Joong Kim
** Description changed:

  Hi,
  
  I have found a security issue on whoopsie 0.2.69 and earlier.
  
  ## Vulnerability in whoopsie
- - whoopsie 0.2.69 and earlier have a memory leak vulnerability.
- - An attacker can cause a denial of service (application crash) via a crafted 
.crash file.
+ - It was discovered that whoopsie incorrectly handled certain malformed crash 
files. If a user using whoopsie were tricked into parsing and uploading a 
specially crafted crash file, an attacker could exploit this to cause a denial 
of service. 
  
  ## Basic
  When a program has been crashed, Linux system tries to create a '.crash' file 
on '/var/crash/' directory with python script located in 
'/usr/share/apport/apport'.
  The file contains a series of system crash information including core dump, 
syslog, stack trace, memory map info, etc.
  A user is given read and write permission to the file.
  After then, whoopsie parses key-value pairs in ‘.crash’ file and encodes it 
into binary json (bson) format.
  Lastly, whoopsie forwards the data to a remotely connected Ubuntu error 
report system.
  
  ## Vulnerability
  We have found a memory leak vulnerability during the parsing the crash file, 
when a collision occurs on GHashTable through g_hash_table_insert().
  According to [1], if the key already exists in the GHashTable, its current 
value is replaced with the new value.
  If 'key_destory_func' and 'value_destroy_func' are supplied when creating the 
table, the old value and the passed key are freed using that function.
  Unfortunately, whoopsie does not handle the old value and the passed key when 
collision happens.
  If a crash file contains same repetitive key-value pairs, it leads to memory 
leak as much as the amount of repetition and results in denial-of-service.
  
  ## Attack
- 1) Create a fake.crash file
- memory_leak_poc.py script measures an available memory and generates a 
malicious crash file that contains same repetitive key-value pairs as much as 
20% of the available memory size; 'ProblemType: Crash'.
- 20% indicates arbitrary amount of the memory leakage.
- 2) Before the attack, the script checks memory usage of whoopsie process with 
psutil
- 3) It triggers the whoopsie to read the fake.crash file
- 4) Then, it measures the memory usage of whoopsie process
- 5) It results in denial-of-service and then other users can no longer report 
crash to the Ubuntu error report system.
+ 1) Generates a certain malformed crash file that contains same repetitive 
key-value pairs.
+ 2) Trigger the whoopsie to read the generated crash file.
+ 3) After then, the whoopsie process has been killed.
  
  ## Mitigation
  We should use g_hash_table_new_full() with ‘key_destroy_func’ and 
‘value_destroy_func’ functions instead of g_hash_table_new().
  Otherwise, before g_hash_table_insert(), we should check the collision via 
g_hash_table_lookup_extended() and obtain pointer to the old value and remove 
it.
  
  Sincerely,
  
  [1] https://developer.gnome.org/glib/stable/glib-Hash-Tables.html#g
  -hash-table-insert

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1881982

Title:
  memory exhaustion in parse_report()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

[Bug 1881982] Re: memory exhaustion in parse_report()

2020-06-15 Thread Seong-Joong Kim
** Summary changed:

- Memory leak in parse_report()
+ memory exhaustion in parse_report()

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1881982

Title:
  memory exhaustion in parse_report()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/whoopsie/+bug/1881982/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs