GSSContext中的安全漏洞acceptSecContext方法? (JAVA)

时间:2018-06-28 13:39:22

标签: java kerberos gssapi kdc

当客户端生成的服务票证发送到服务器时,GSSContext acceptSecContext方法将对由KDC编码的票证进行解码。

以服务票证作为参数调用此方法时,票证实际上是否已发送到KDC本身以进行解码?

否则这不是安全问题吗?因为如果服务器可以解码任何有效的票证,除了发送给它的某个客户端或该票证的目的或对象之外,它什么都不知道?

有点困惑

任何澄清都将不胜感激。

我已阅读到Application Server和KDC确实可以通信,但我认为并非总是如此。

例如,查看示例服务器代码

应用程序服务器登录以获取上下文

LoginContext loginCtx = null;
loginCtx = new LoginContext("SPN", new LoginCallbackHandler( id, password ));
loginCtx.login();
Subject subject = loginCtx.getSubject();

然后使用该对象,将执行特权doAs

Subject.doAs( subject, new PrivilegedAction<String>() {
  public void run() {
    try {
        GSSManager manager = GSSManager.getInstance();
        GSSContext context = manager.createContext( (GSSCredential) null);
        context.acceptSecContext( serviceTicket, 0, serviceTicket.length);
        // now do something with decoded ticket 
    }
...
}

1 个答案:

答案 0 :(得分:1)

  

实际上是将票证发送到KDC进行解码吗?

否,应用服务器与KDC 通信。

这就是为什么在使用系统之前必须将keytab上生成的KDC复制到应用服务器上的原因。

服务器尝试解密票证,如果他能够解密票证,则他认为票证是由KDC生成的,因为他是唯一知道密码的,这是一张有效的车票。


在许多系统中,例如

的一种常见机制是在系统有效启动之前预先共享密钥/密码,然后再从不通过网络发送密钥/密码。