Thread.strop removed: how to deal with a rogue ScriptEngine thread?
Francois
fanf42 at gmail.com
Mon Jul 23 19:16:41 UTC 2018
On 23/07/2018 15:43, Roger Riggs wrote:
> Hi Francois,
>
> [The core-libs-dev at openjdk.java.net would also be a good mail list for
> the discussion.]
>
> There is no simple solution to stopping runaway computations and
> retaining the integrity
> of the remaining system but there are mitigations that can
> incrementally reduce the impact.
>
> If you control the scripting language that is exposed, you can build
> in checkpoints
> for runaway cpu consumption. Lightweight checks such as elapsed clock
> time (System.nanoTime)
> can be used to periodically check for accumulated cpu time, and other
> resource excessive usage.
>
> Impact on other processes can be reduced by throttling the computation
> by introducing
> wait times to avoid exceeding some threshold of the ratio between
> cputime and clock time.
> Depending on what's in the loop, throwing InterruptedException may
> sufficiently disrupt
> the loop so it terminates.
> If the script is really while(true){}; then perhaps the interpreter
> can flag that as a potential bug.
>
> Regards, Roger
Thanks,
Unfortunatly I don't have a hand on the underlying scripting engine /
language (it's just nashorn/js). But I can totally add a sanity check at
least for trivial loops. I will keep the idea, thanks !
>
>
> On 7/23/18 8:55 AM, Francois wrote:
>> Hello,
>>
>> I'm not sure at all it is the correct mailing list for that, so sorry
>> if it is not, and please let me know where I should post my concerns.
>>
>> So, in JDK 11, the long term deprecated Thread.stop() will is removed
>> (https://bugs.openjdk.java.net/browse/JDK-8204243), and I have an use
>> case that I don't know how to deal with afterwards.
>>
>> We use nashorm to provides user with a embeded scripting languageon
>> our plateform. Only simple things are accessible, and we try to
>> forbid dangerous things like killing the host process, deleting the
>> underlying filesystem, or infinite, not
>> pause-to-look-for-Thread.interrupt while loops.
>> The first two kind of problem are easely managed with a custom
>> security manager and a thread factory that uses itfor starting the
>> sandboxed process (ie: nashorn.eval).
>>
>> But I don't know how to manage the while(true){} loop. In that case,
>> the nashorn thread does not respond to Thread.interrupt (it is a wide
>> source of surpise and wonders on the internet, see for example:
>> https://stackoverflow.com/questions/1601246/java-scripting-api-how-to-stop-the-evaluation/1601465#1601465
>> and the problem is more generally that Java ScriptEngine API does not
>> provide a way to interrupt underlying process ounce started). So I
>> used to have a timeout counter and a Thread.stop() on it. Ido
>> understand that it could still raise problems, even with the custom
>> threadfactory and the very specific use case, but it was the only
>> solution I knew of at hand.
>>
>> But now, I don't have any at all to prevent an user to start
>> unstoppable thread (by malice or by error).
>>
>> Any help would be much appreciated on that topic.
>>
>
--
Francois ARMAND - @fanf42
https://github.com/Normation/rudder
http://www.normation.com
More information about the discuss
mailing list