From ba33bd67cdaef87aba8a4e95dca8dcf108a7d73f Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 27 Sep 2018 11:38:33 +0200 Subject: [PATCH] [SECURITY-1114] --- .../main/java/hudson/model/AbstractItem.java | 11 +++ core/src/main/java/hudson/model/Run.java | 31 +++++- core/src/main/java/hudson/model/User.java | 13 ++- .../hudson/AbstractItemSecurity1114Test.java | 97 +++++++++++++++++++ 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/hudson/AbstractItemSecurity1114Test.java diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 9abd3e8708..a9dcfe4137 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -56,6 +56,7 @@ import jenkins.util.xml.XMLUtils; import org.apache.tools.ant.taskdefs.Copy; import org.apache.tools.ant.types.FileSet; +import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.export.Exported; @@ -91,6 +92,8 @@ import javax.xml.transform.stream.StreamSource; import static hudson.model.queue.Executables.getParentOf; import hudson.model.queue.SubTask; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; + import org.apache.commons.io.FileUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -841,6 +844,14 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet @Restricted(NoExternalUse.class) public Object getTarget() { if (!SKIP_PERMISSION_CHECK) { + if (!getACL().hasPermission(Item.DISCOVER)) { + // work around Stapler bug when returning null from getTarget() + try { + Stapler.getCurrentResponse().sendError(SC_NOT_FOUND); // send same response body Stapler would send + } catch (IOException ex) { + throw HttpResponses.notFound(); + } + } getACL().checkPermission(Item.READ); } return this; diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 84a31086a9..2fb4b7e5f5 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -93,6 +93,8 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; import static java.util.logging.Level.*; +import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; + import java.util.logging.Logger; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -120,8 +122,10 @@ import org.apache.commons.lang.ArrayUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; @@ -141,7 +145,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; */ @ExportedBean public abstract class Run ,RunT extends Run> - extends Actionable implements ExtensionPoint, Comparable, AccessControlled, PersistenceRoot, DescriptorByNameOwner, OnMaster { + extends Actionable implements ExtensionPoint, Comparable, AccessControlled, PersistenceRoot, DescriptorByNameOwner, OnMaster, StaplerProxy { /** * The original {@link Queue.Item#getId()} has not yet been mapped onto the {@link Run} instance. @@ -2480,6 +2484,31 @@ public abstract class Run ,RunT extends Run