2121#include " ../gc/gc.h"
2222#include " ../iast.h"
2323#include " v8.h"
24+ #include " ../utils/string_utils.h"
2425
2526using v8::Exception;
2627using v8::FunctionCallbackInfo;
@@ -33,6 +34,7 @@ using v8::Value;
3334using v8::Array;
3435
3536using iast::tainted::InputInfo;
37+ using iast::tainted::secure_marks_t ;
3638
3739namespace iast {
3840namespace api {
@@ -98,7 +100,7 @@ void NewTaintedString(const FunctionCallbackInfo<Value>& args) {
98100
99101 auto range = transaction->GetRange (0 ,
100102 utils::GetLength (args.GetIsolate (), parameterValue),
101- inputInfo);
103+ inputInfo, 0 );
102104 auto ranges = transaction->GetSharedVectorRange ();
103105 ranges->PushBack (range);
104106 auto stringPointer = utils::GetLocalStringPointer (parameterValue);
@@ -112,6 +114,71 @@ void NewTaintedString(const FunctionCallbackInfo<Value>& args) {
112114 }
113115}
114116
117+ void AddSecureMarksToTaintedString (const FunctionCallbackInfo<Value>& args) {
118+ auto isolate = args.GetIsolate ();
119+ if (args.Length () < 3 ) {
120+ isolate->ThrowException (v8::Exception::TypeError (
121+ v8::String::NewFromUtf8 (isolate,
122+ " Wrong number of arguments" ,
123+ v8::NewStringType::kNormal ).ToLocalChecked ()));
124+ return ;
125+ }
126+
127+ if (!(args[0 ]->IsString ()) || !Local<String>::Cast (args[0 ])->Length ()) {
128+ // invalid transaction id, return taintedString
129+ args.GetReturnValue ().Set (args[1 ]);
130+ return ;
131+ }
132+
133+ if (!(args[1 ]->IsString ())) {
134+ // invalid taintedString, return it
135+ args.GetReturnValue ().Set (args[1 ]);
136+ return ;
137+ }
138+
139+ auto context = isolate->GetCurrentContext ();
140+
141+ auto transactionIdArgument = args[0 ];
142+ auto taintedString = args[1 ];
143+ auto secureMarksArgument = args[2 ];
144+
145+ args.GetReturnValue ().Set (taintedString);
146+
147+ secure_marks_t secureMarks = secureMarksArgument->IntegerValue (context).FromJust ();
148+ if (secureMarks == 0 ) {
149+ // not secure marks to add
150+ return ;
151+ }
152+
153+ uintptr_t transactionId = utils::GetLocalStringPointer (transactionIdArgument);
154+ auto transaction = NewTransaction (transactionId);
155+ if (transaction == nullptr ) {
156+ return ;
157+ }
158+ auto taintedObj = transaction->FindTaintedObject (utils::GetLocalStringPointer (taintedString));
159+ if (!taintedObj) {
160+ // It is not a tainted object, do nothing
161+ return ;
162+ }
163+ try {
164+ auto newRanges = transaction->GetSharedVectorRange ();
165+ auto oRanges = taintedObj->getRanges ();
166+ taintedString = tainted::NewStringInstanceForNewTaintedObject
167+ (isolate, v8::Local<v8::String>::Cast (taintedString));
168+ for (auto it = oRanges->begin (); it != oRanges->end (); ++it) {
169+ auto oRange = *it;
170+ auto start = oRange->start ;
171+ auto end = oRange->end ;
172+ auto oSecureMarks = oRange->secureMarks ;
173+ newRanges->PushBack (transaction->GetRange (start, end, oRange->inputInfo , oSecureMarks | secureMarks));
174+ }
175+ transaction->AddTainted (utils::GetLocalStringPointer (taintedString), newRanges, taintedString);
176+ args.GetReturnValue ().Set (taintedString);
177+ } catch (const std::bad_alloc& err) {
178+ } catch (const container::QueuedPoolBadAlloc& err) {
179+ } catch (const container::PoolBadAlloc& err) {
180+ }
181+ }
115182void IsTainted (const FunctionCallbackInfo<Value>& args) {
116183 auto argsLength = args.Length ();
117184 if (argsLength < 2 ) {
@@ -149,7 +216,6 @@ void GetRanges(const FunctionCallbackInfo<Value>& args) {
149216 NewStringType::kNormal ).ToLocalChecked ()));
150217 return ;
151218 }
152-
153219 uintptr_t transactionId = utils::GetLocalStringPointer (args[0 ]);
154220 auto transaction = GetTransaction (transactionId);
155221 if (transaction != nullptr ) {
@@ -206,6 +272,7 @@ void SetMaxTransactions(const FunctionCallbackInfo<Value>& args) {
206272void StringMethods::Init (Local<Object> exports) {
207273 NODE_SET_METHOD (exports, " createTransaction" , CreateTransaction);
208274 NODE_SET_METHOD (exports, " newTaintedString" , NewTaintedString);
275+ NODE_SET_METHOD (exports, " addSecureMarksToTaintedString" , AddSecureMarksToTaintedString);
209276 NODE_SET_METHOD (exports, " isTainted" , IsTainted); // TODO(julio): support several objects.
210277 NODE_SET_METHOD (exports, " getRanges" , GetRanges);
211278 NODE_SET_METHOD (exports, " removeTransaction" , DeleteTransaction);
0 commit comments