我打算通过互联网公开一个用于远程调试基于Java的Web服务的端口,但是想了两次我意识到它没有任何身份验证。
理论上,似乎可以编写一个附加到远程调试器端口的工具,并通过Java API执行任意系统命令。或者修改/转储数据库,依此类推。 至少这种利用似乎是http://securityaffairs.co/wordpress/36394/hacking/paypal-remote-code-execution.html
的情况我不记得曾经强烈警告过暴露远程调试器端口。但是现在,当数百个僵尸网络扫描端口寻找漏洞时,应该更好地做广告。
可以请任何人评论它是否安全和/或如何以安全的方式在任意基于Java的Web服务上执行此操作?我的目标是能够在生产服务器上执行远程调试。
答案 0 :(得分:7)
您可以配置远程调试以使用SSL和身份验证,这适用于Windows和Linux,但有点麻烦。港口一直开着。
我确信您有充分的理由调试您的实时/高效应用程序并知道当您真正调试它时,不仅使用连接来获取对JMX数据的访问权限,例如,当您连接调试器时,您的应用程序将停止运行。
Oracle documents一些风险,一些风险更高或更低,具体取决于您配置代理的方式:
注意 - 已使用密码识别出潜在的安全问题 客户端获取时对远程连接器的身份验证 来自不安全的RMI注册表的远程连接器(默认)。如果 攻击者在之前在目标服务器上启动伪造的RMI注册表 合法的注册表启动,然后攻击者就可以窃取客户端' 密码。此方案包括启动Java VM的情况 启用远程管理,使用系统属性 com.sun.management.jmxremote.port = portNum,即使启用了SSL也是如此。 尽管可能会注意到这种攻击,但它仍然是一种攻击 漏洞。
注意 - 此配置不安全。任何知道的远程用户 (或猜测)您的JMX端口号和主机名将能够 监视和控制Java应用程序和平台。虽然它可能 对于开发是可以接受的,不建议用于生产 系统
注意 - 此配置不安全:任何知道的远程用户 (或猜测)您的端口号和主机名将能够监控 并控制您的Java应用程序和平台。此外,可能 损害不仅限于您在MBean中定义的操作。一个 远程客户端可以创建一个javax.management.loading.MLet MBean和 使用它从任意URL创建新的MBean,至少如果有的话 没有安全经理。换句话说,一个流氓远程客户端可以制作 您的Java应用程序执行任意代码。
因此,虽然禁用安全性可能是可以接受的 开发时,强烈建议您不要禁用 生产系统的安全性。
即使涉及最高安全性的配置(移植端口,启用ssl,通过ssl客户端证书进行身份验证)仍然存在风险。 如果您仍然需要调试连接,我建议您使用可能已存在的服务器ssh连接,并使用此连接创建到调试器端口的ssh隧道。你可以在这里阅读更多相关信息:Cannot remotely debug JVM via SSH tunnel(因为它已经开始了我不会复制细节)
打开没有加密和身份验证的端口将允许任何人连接到您的jvm。这将允许读取和写入JMX值,停止代码的执行,修改值,创建堆转换,覆盖代码和所有其他不良内容。