Ruby through 2.2.7, 2.3.x through 2.3.4, and 2.4.x through 2.4.1 can expose arbitrary memory during a JSON.generate call. The issues lies in using strdup in ext/json/ext/generator/generator.c, which will stop after encountering a '\0' byte, returning a pointer to a string of length zero, which is not the length stored in space_len.
{
"binaries": [
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "libruby1.9.1"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "libtcltk-ruby1.9.1"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ri1.9.1"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ruby1.9.1"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ruby1.9.1-dev"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ruby1.9.1-examples"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ruby1.9.1-full"
},
{
"binary_version": "1.9.3.484-2ubuntu1.5",
"binary_name": "ruby1.9.3"
}
],
"availability": "No subscription required"
}
{
"binaries": [
{
"binary_version": "2.0.0.484-1ubuntu2.10",
"binary_name": "libruby2.0"
},
{
"binary_version": "2.0.0.484-1ubuntu2.10",
"binary_name": "ruby2.0"
},
{
"binary_version": "2.0.0.484-1ubuntu2.10",
"binary_name": "ruby2.0-dev"
},
{
"binary_version": "2.0.0.484-1ubuntu2.10",
"binary_name": "ruby2.0-tcltk"
}
],
"availability": "No subscription required"
}
{
"binaries": [
{
"binary_version": "2.3.1-2~16.04.5",
"binary_name": "libruby2.3"
},
{
"binary_version": "2.3.1-2~16.04.5",
"binary_name": "ruby2.3"
},
{
"binary_version": "2.3.1-2~16.04.5",
"binary_name": "ruby2.3-dev"
},
{
"binary_version": "2.3.1-2~16.04.5",
"binary_name": "ruby2.3-tcltk"
}
],
"availability": "No subscription required"
}