Browse Source

Pissibly fix serialization errors

Jonas Pflanzer 4 years ago
parent
commit
ffe5763923

+ 11 - 0
daemon/include/CovertChannel/CovertChannel.h

@@ -1,6 +1,7 @@
 #ifndef COVERTCHANNEL_H
 #define COVERTCHANNEL_H
 
+#include <mutex>
 #include <thread>
 #include <tins/tins.h>
 
@@ -156,6 +157,16 @@ protected:
 	 */
 	Tins::PacketSender outerSender;
 
+	/**
+	 * lock sender to prevent serialization errors
+	 */
+	std::mutex innerSenderMutex;
+
+	/**
+	 * lock sender to prevent serialization errors
+	 */
+	std::mutex outerSenderMutex;
+
 private:
 	/**
 	 * Thread for the inner forward sniffer

+ 8 - 0
daemon/include/CovertChannel/TCPUrgencyChannel.hpp

@@ -72,11 +72,15 @@ protected:
 			uint16_t data = tcp.urg_ptr();
 			protocol.receive((uint8_t *)(&data));
 			tcp.urg_ptr(0);
+			innerSenderMutex.lock();
 			innerSender.send(pdu);
+			innerSenderMutex.unlock();
 		} else {
 			// uint16_t urg = tcp.urg_ptr();
 			// tcp.urg_ptr(0);
+			innerSenderMutex.lock();
 			innerSender.send(pdu);
+			innerSenderMutex.unlock();
 		}
 		return true;
 	}
@@ -93,12 +97,16 @@ protected:
 	virtual bool handleChannelFromInner(Tins::PDU &pdu) {
 		Tins::TCP &tcp = pdu.rfind_pdu<Tins::TCP>();
 		if constexpr (PASSIVE) {
+			outerSenderMutex.lock();
 			outerSender.send(pdu);
+			outerSenderMutex.unlock();
 		} else {
 			uint16_t data = 0;
 			protocol.send((uint8_t *)(&data));
 			tcp.urg_ptr(data);
+			outerSenderMutex.lock();
 			outerSender.send(pdu);
+			outerSenderMutex.unlock();
 		}
 		return true;
 	}

+ 4 - 0
daemon/src/CovertChannel/CovertChannel.cpp

@@ -63,13 +63,17 @@ void CovertChannel::startInnerChannelSniffing() { innerChannelSniffer->sniff_loo
 void CovertChannel::startOuterChannelSniffing() { outerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelFromOuter)); }
 
 bool CovertChannel::handleForwardFromOuter(Tins::PDU &pdu) {
+	innerSenderMutex.lock();
 	innerSender.send(pdu);
+	innerSenderMutex.unlock();
 
 	return true;
 }
 
 bool CovertChannel::handleForwardFromInner(Tins::PDU &pdu) {
+	outerSenderMutex.lock();
 	outerSender.send(pdu);
+	outerSenderMutex.unlock();
 
 	return true;
 }