You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2017/04/06 23:46:59 UTC
mesos git commit: Improve master robustness against duplicate UPIDs.
Repository: mesos
Updated Branches:
refs/heads/master c52f5bf34 -> 362d09592
Improve master robustness against duplicate UPIDs.
It is possible for a malicious client to send libprocess SUBSCRIBE
requests that will trigger the !frameworks.principals.contains(...)
CHECK. This can happen if the client sends a subscribe with a
framework ID, then a second subscribe with a different framework ID
but the same UPID. The invariant in the master is that a UPID uniquely
identifies a given framework. This is violated if we allow multiple
frameworks with the same UPID.
Review: https://reviews.apache.org/r/58242/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/362d0959
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/362d0959
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/362d0959
Branch: refs/heads/master
Commit: 362d0959295bd460fdeb62a7cd80d744c87b84ea
Parents: c52f5bf
Author: James Peach <jp...@apache.org>
Authored: Thu Apr 6 16:46:45 2017 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Apr 6 16:46:45 2017 -0700
----------------------------------------------------------------------
src/master/master.cpp | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/362d0959/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index e547d2c..c1f3c4f 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2912,6 +2912,8 @@ void Master::_subscribe(
}
}
+ CHECK(!frameworks.principals.contains(from));
+
// Assign a new FrameworkID.
FrameworkInfo frameworkInfo_ = frameworkInfo;
frameworkInfo_.mutable_id()->CopyFrom(newFrameworkId());
@@ -2931,6 +2933,20 @@ void Master::_subscribe(
// If we are here the framework has already been assigned an id.
CHECK(!frameworkInfo.id().value().empty());
+ // Check whether we got a subscribe from a framework whose UPID duplicates
+ // a framework that is already connected. Note that we don't send an error
+ // response because that would go to the framework that is already connected.
+ if (frameworks.principals.contains(from)) {
+ foreachvalue (Framework* framework, frameworks.registered) {
+ if (framework->pid == from && framework->id() != frameworkInfo.id()) {
+ LOG(ERROR) << "Dropping SUBSCRIBE call for framework '"
+ << frameworkInfo.name() << "': " << *framework
+ << " already connected at " << from;
+ return;
+ }
+ }
+ }
+
Framework* framework = getFramework(frameworkInfo.id());
if (framework == nullptr) {